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...
Box<Trait>
эквивалентноBox<Trait + 'static>
. Если вы хотите другое время жизни, вам нужно быть явным и использоватьBox<Trait + 'a>
. - person Sven Marnach   schedule 13.12.2018