Как мне создать объект черты из другого объекта черты?
Последняя стабильная версия 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 ...
сам.