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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!