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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!