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
tT->&T,打印1wt&T,打印1wwt&&T->&&&T->&mut &&T->&T,打印1wwwt&&&T->&&&&T,打印2wwwwt&&&&T,打印2wwwwwt&&&&&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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: