rust-quiz:023-inherent-vs-trait-method.md

题目

trait Trait {
    fn f(&self);
    fn g(&self);
}

struct S;

impl S {
    fn f(&self) {
        print!("1");
    }

    fn g(&mut self) {
        print!("1");
    }
}

impl Trait for S {
    fn f(&self) {
        print!("2");
    }

    fn g(&self) {
        print!("2");
    }
}

fn main() {
    S.f();
    S.g();
}

关键

我们之前说过方法的查找,一般顺序为
T -> &T -> &mut T
对于同名的方法
T -> Trait

题解

这里就是详细区分T的方法的查找。

  • S.f()
    因为原生的impl S就有f,因此直接使用,打印1

  • S.g()
    这里有原生的S::g,也有Trait::g,一般情况下都会使用S::g
    但是这里的S::g的签名是&mut self
    它的优先级低于Trait::g(&self),因此使用的是Trait::g
    打印2

可以看到,相对于TTrait的区别,引用类型的优先级更高。

答案

12

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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