Как мне создать объект черты из другого объекта черты?

Последняя стабильная версия Rust (1.27) позволяет реализовать черту для объектов черты (dyn Trait), поэтому я попробовал следующее:

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`

Это сбивает с толку, как &T1 это пример dyn T1 и так имеет T2 реализация. Мы можем даже засвидетельствовать это фактом, что мы можем назвать f2 на t12 непосредственно, как удаление двух последних строк в main делает компиляцию

Можно ли создать объект черты из объекта черты, который помечен как другая черта?

1 ответ

Вы реализуете T2 для самого признака объекта (dyn T1), но пытаюсь использовать его для ссылки на объект черты (&dyn T1).

Пытаться impl<'a> T2 for &'a dyn T1 { ... } вместо. Это означает "Для любой жизни 'a, воплощать в жизнь T2 для справки, которая действительна для 'a и относится к T1объект ".
Я не знаю хорошего использования impl ... for dyn ... сам.

Скорректирован код из вопроса на детской площадке

Другие вопросы по тегам