rust-quiz:031-method-lookup.rs
题目
trait Or {
fn f(self);
}
struct T;
impl Or for &T {
fn f(self) {
print!("1");
}
}
impl Or for &&&&T {
fn f(self) {
print!("2");
}
}
fn main() {
let t = T;
let wt = &T;
let wwt = &&T;
let wwwt = &&&T;
let wwwwt = &&&&T;
let wwwwwt = &&&&&T;
t.f();
wt.f();
wwt.f();
wwwt.f();
wwwwt.f();
wwwwwt.f();
}
关键
- 方法查找
T
->&T
->&mut T
而且不只一层,可以层层递进。
其中主要原因在于,&T
和&mut T
实现的方法会添加到T
的列表中。
但是,对于&T
类型,一直找不到的情况下,会面临*&T
,查找本体的方法。
解题
这里&T
打印1
,&&&&T
打印2
t
T
->&T
,打印1
wt
&T
,打印1
wwt
&&T
->&&&T
->&mut &&T
->&T
,打印1
wwwt
&&&T
->&&&&T
,打印2
wwwwt
&&&&T
,打印2
wwwwwt
&&&&&T
->&&&&&&T
->&mut &&&&&T
->&&&&T
,打印2
。
答案
111222
这里可以看出来,整体的特殊解析其实可以T
-> &T
-> &mut T
- - - > *(*T)
但是针对T
而言,&
操作只会深入一层,但是解引用defer
会一直解析,知道查找到对应的方法。
去掉对应的&&&&T
方法实现,全部都将打印1
。
impl Or for &&&&T {
fn f(self) {
print!("2");
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: