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);
| ^^^^^^^^^^
這給我沒有跡象表明編譯器認爲盒裝值有多長。
啊,我明白了。我想這是有道理的。我想知道是否有任何方法可以阻止這種可能性,並迫使這個盒子在'一個人的整個生命中生活。 –