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

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

相關文章