データ構造とライフタイム

データ型が借用データを内部に保持する場合、ライフタイムアノテーションを付ける必要があります。

#[derive(Debug)]
struct Highlight<'doc>(&'doc str);

fn erase(text: String) {
    println!("Bye {text}!");
}

fn main() {
    let text = String::from("The quick brown fox jumps over the lazy dog.");
    let fox = Highlight(&text[4..19]);
    let dog = Highlight(&text[35..43]);
    // 消去(テキスト);
    println!("{fox:?}");
    println!("{dog:?}");
}
This slide should take about 5 minutes.
  • 上記の例では、Highlight のアノテーションにより、内包される&str の参照先のデータは、少なくともそのデータを使用する Highlight のインスタンスが存在する限り存続しなければならなくなります。
  • fox(または dog)のライフタイムが終了する前に text が使用されると、借用チェッカーはエラーをスローします。
  • 消費したデータが含まれる型では、ユーザーは元のデータを保持せざるを得なくなります。これは軽量のビューを作成する場合に便利ですが、一般的には使いにくくなります。
  • 可能であれば、データ構造がデータを直接所有できるようにします。
  • 内部に複数の参照がある構造体には、複数のライフタイム アノテーションが含まれる場合があります。これが必要になるのは、構造体自体のライフタイムだけでなく、参照同士のライフタイムの関係を記述する必要がある場合です。これは非常に高度なユースケースです。