これはDefaultトレイトの標準実装では対応できない(@Rust)

 

https://doc.rust-jp.rs/rust-by-example-ja/scope/lifetime/trait.html

のライフタイムアサーションに出てくるコード、

// A struct with annotation of lifetimes.
// ライフタイムのアノテーションつき構造体。
#[derive(Debug)]
struct Borrowed<'a> {
    x: &'a i32,
}

// Annotate lifetimes to impl.
// ライフタイムのアノテーションつきimpl。
impl<'a> Default for Borrowed<'a> {
    fn default() -> Self {
        Self {
            x: &10,
        }
    }
}

fn main() {
    let b: Borrowed = Default::default();
    println!("b is {:?}", b);
}

ここでなぜ#[derive(Default)]ではダメなのか、それはまさしくBorrowed構造体のデータで参照を使っているので絶対にライフタイム指定が必要、かつライフタイムを指定した場合には構造体Borrowedに対してDefaultトレイトの標準実装では対応できないからカスタム実装が必要となります。

もしデータがmoveされる以下のコードならば、

// A struct with annotation of lifetimes.
// ライフタイムのアノテーションつき構造体。
#[derive(Debug, Default)]
struct Borrowed {
    x: i32,
}

// Annotate lifetimes to impl.
// ライフタイムのアノテーションつきimpl。
/*
impl<'a> Default for Borrowed<'a> {
    fn default() -> Self {
        Self {
            x: &10,
        }
    }
}
*/

fn main() {
    let b: Borrowed = Borrowed{x: 5,};
    println!("b is {:?}", b.x);
}

Defaultトレイトは標準実装で問題ありません

 

admin

カテゴリーRust