Смущает время жизни Box<Trait> в структуре
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
эквивалентно этому, кроме 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...