rust-quiz:010-shadowed-trait-object-method.rs

godme發表於2022-07-11
trait Trait {
    fn f(&self);
}

impl<'a> dyn Trait + 'a {
    fn f(&self) {
        print!("1");
    }
}

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

fn main() {
    Trait::f(&true);
    Trait::f(&true as &dyn Trait);
    <_ as Trait>::f(&true);
    <_ as Trait>::f(&true as &dyn Trait);
    <bool as Trait>::f(&true);
}
  • 指向性呼叫
    我們平時都會有太多重名方法,都需要namespace才能無誤的進行呼叫。
    使用指向性呼叫f::<T>()透過其中加上泛型從而實現泛型的功能。
    對於同名方法,我們使用A::f()B::f()來區分同名的不同namespace的方法。
    從而指向性的選擇介面、物件等不同名稱空間下的同名方法。

  • trait-object
    每個實現trait的物件,都能夠作為一個trait-object
    rust也可以為trait實現方法,只要是trait-object都可以使用。

到底是1還是2,對應的是呼叫的主體是Trait還是Trait-Object
可是不論傳入的引數如何,分析一下字首

  • Trait::f
  • Trait::f
  • <_ as Trait>::f
  • <_ as Trait>::f
  • <bool as Trait>::f

其實都是Trait的方法呼叫,因此結果只能是22222

作者補充瞭如下兩種情況

<dyn Trait>::f(&true);
<dyn Trait>::f(&true as &dyn Trait);

分析字首,我們可以看到不一樣的了,因為它是針對<dyn Trait>::f的呼叫。
但是目前還是會失敗,因為Trait-Object並不能覆蓋Trait方法。

22222

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章