1
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つのレイヤーを削除するだけです。何がそれほど異なる動作をするのかわかりません。BoxWrapbtContTrait

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...

遊び場

4

0 に答える 0