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 協議》,轉載必須註明作者和本文連結