rust-quiz:031-method-lookup.rs

godme發表於2022-07-15
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 協議》,轉載必須註明作者和本文連結

相關文章