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::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 协议》,转载必须注明作者和本文链接