与Box中的Box <trait>的生存期混淆

时间:2018-12-13 12:41:01

标签: rust lifetime trait-objects

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... 行时,出现以下错误消息:

{{1}}

playground

0 个答案:

没有答案