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 協議》,轉載必須註明作者和本文連結