trait X {}
trait Y {}
struct A {}
impl X for A {}
struct B<'r> {
x: &'r mut Box<dyn X + 'r>,
id: i32,
}
impl <'r> Y for B<'r> {}
struct Out {
x: Box<dyn X>,
}
impl Out {
pub fn new() -> Self {
return Out {
x: Box::new(A{})
}
}
pub fn get_data(&mut self) -> Box<dyn Y> {
return Box::new(B{
id: 1,
x: &mut self.x
})
}
}
here在操场上运行。
我从编译器获得此注释:
note: but, the lifetime must be valid for the static lifetime...
= note: ...so that the expression is assignable:
expected &mut std::boxed::Box<dyn X>
found &mut std::boxed::Box<(dyn X + 'static)>
我了解静态寿命是从哪里来的,但是在结构B的创建过程中它没有接受相同的寿命。
[在以下答案后编辑]
我还尝试使struct Out泛型,但是初始化后无法使用它。
答案 0 :(得分:0)
我已将其修复(playground)。以下是相关代码:
// note the lifetime!
struct Out<'a> {
x: Box<dyn X + 'a>,
}
// note the lifetime!
impl<'a> Out<'a> {
pub fn new() -> Self {
return Out {
x: Box::new(A{})
}
}
pub fn get_data(&'a mut self) -> Box<dyn Y + 'a> {
return Box::new(B {
id: 1,
x: &mut self.x,
})
}
}
为什么要这样做?
特质对象始终具有生命周期。如果未指定或推断生存期,则默认为'static
。因此,您必须在整个生命周期内使Out
通用,并在实现中使用它。