生命周期必须对静态生命周期有效

时间:2019-11-11 10:40:48

标签: rust

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泛型,但是初始化后无法使用它。

1 个答案:

答案 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通用,并在实现中使用它。