rust-quiz:010-shadowed-trait-object-method.rs 
                                                    
                        
                    
                    
  
                    
                    题目
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::fTrait::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 协议》,转载必须注明作者和本文链接
          
          
          
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: