2017-07-26 68 views
3

下面的代码无法编译:寿命的参考值盒装不活足够长的时间

use std::borrow::Borrow; 

struct Inner<'a> { 
    v: Vec<&'a u8>, 
} 

struct Foo<'a> { 
    inner: Inner<'a>, 
    derp: Box<u8>, 
} 

impl<'a> Foo<'a> { 
    fn new() -> Foo<'a> { 
     let mut e = Foo { 
      inner: Inner { v: vec![] }, 
      derp: Box::new(128), 
     }; 
     e.inner.v.push(&*e.derp); 

     return e; 
    } 

    fn derp(&mut self) { 
     println!("{:?}", self.inner.v); 
    } 
} 

fn main() { 
    let mut f = Foo::new(); 

    f.derp(); 
} 

我得到以下错误:

error[E0597]: `*e.derp` does not live long enough 
    --> src/main.rs:18:25 
    | 
18 |   e.inner.v.push(&*e.derp); 
    |       ^^^^^^^ does not live long enough 
... 
21 |  } 
    |  - borrowed value only lives until here 
    | 
note: borrowed value must be valid for the lifetime 'a as defined on the impl at 12:1... 
    --> src/main.rs:12:1 
    | 
12 |/impl<'a> Foo<'a> { 
13 | |  fn new() -> Foo<'a> { 
14 | |   let mut e = Foo { 
15 | |    inner: Inner { v: vec![] }, 
... | 
25 | |  } 
26 | | } 
    | |_^ 

我觉得那里面的值了盒子的寿命只有'a,因为它是Foo的成员,它具有这样的寿命。

我想知道在新函数结束时Foo的移动是否令人困惑,因此如果试图在derp中执行附加操作。我得到了一个不同的错误:

error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements 
    --> main.rs:20:27 
    | 
20 |   self.inner.v.push(& *self.derp); 
    |       ^^^^^^^^^^ 

这给我没有迹象表明编译器认为盒装值有多长。

回答

3

I think though that the value inside of the box does live for as long as 'a since it is a member of Foo which has exactly that lifetime.

它可以在它结束分配一个新的方框,derp构件,在该点处的老框将被丢弃,并且该值的寿命。

我认为你正在尝试做的事情是不可能的在安全锈:不支持结构成员之间的交叉引用。这经常作为一个问题出现,但它只是在语言中不可用。

您可以使用Rc来解决这个问题,也许结合RefCell

+0

啊,我明白了。我想这是有道理的。我想知道是否有任何方法可以阻止这种可能性,并迫使这个盒子在'一个人的整个生命中生活。 –