如何从另一个特征对象创建特征对象?

时间:2018-07-07 11:55:08

标签: rust trait-objects

Rust(1.27)的最新稳定版本允许为特征对象(dyn Trait)实现特征,因此我尝试了following

trait T1 {
    fn f1(&self);
}
trait T2 {
    fn f2(&self);
}
impl T2 for dyn T1 {
    fn f2(&self) {
        self.f1()
    }
}
struct S();
impl T1 for S {
    fn f1(&self) {}
}

fn main() {
    let t1 = S();
    let t12: &T1 = &t1;
    t12.f2();
    let t2: &T2 = &t12;
    t2.f2();
}

上面的代码导致错误:

error[E0277]: the trait bound `&T1: T2` is not satisfied
  --> src/main.rs:21:19
   |
21 |     let t2: &T2 = &t12;
   |                   -^^^
   |                   |
   |                   the trait `T2` is not implemented for `&T1`
   |                   help: consider removing 1 leading `&`-references
   |
   = help: the following implementations were found:
             <T1 + 'static as T2>
   = note: required for the cast to the object type `T2`

这令人困惑,因为&T1dyn T1的实例,因此具有T2的实现。我们甚至可以直接在f2上调用t12来见证这一点,因为删除main中的最后两行使其可以编译。

是否可以从标记为其他特征的特征对象创建特征对象?

1 个答案:

答案 0 :(得分:3)

您正在为特征对象本身(T2)实现dyn T1,但试图将其用于对特征对象(&dyn T1引用

改为尝试impl<'a> T2 for &'a dyn T1 { ... }。这意味着“对于任何生命周期'a,对于有效T2并引用'a特征对象的引用实现T1”。
我不知道impl ... for dyn ...本身的用法。

Adjusted code from the question in the playground