struct Wrap<'a> {
pub data: Option<&'a i32>,
}
pub trait Boxable {
fn get_data(&self) -> Option<&i32>;
}
impl<'a> Boxable for Wrap<'a> {
fn get_data(&self) -> Option<&i32> {
self.data
}
}
struct ContTrait {
pub vbox: Box<Boxable>,
}
struct ContWrap<'a> {
pub vbox: Box<Wrap<'a>>,
}
fn main() {
let x1 = 15;
let bt = Box::new(Wrap { data: Some(&x1) });
// let mut c = ContTrait { vbox: Box::new(Wrap {data : Some(&x1)}) };
let mut c2 = ContWrap {
vbox: Box::new(Wrap { data: Some(&x1) }),
};
}
コメント行だけをコンパイルできず、x1
の有効期間が十分に長くないと考える理由を正当化できません。が直接構造体用であるc2
ことを除いて、それと同等のようです。構造体の1つのレイヤーを削除するだけです。何がそれほど異なる動作をするのかわかりません。Box
Wrap
bt
ContTrait
ContTrait
行のコメントを外すと、次のエラー メッセージが表示されます。
error[E0597]: `x1` does not live long enough
--> src/main.rs:27:63
|
27 | let mut c = ContTrait { vbox: Box::new(Wrap {data : Some(&x1)}) };
| ^^ borrowed value does not live long enough
...
31 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...