データ構造におけるライフタイム

データ型が借用データを保持する場合は、ライフタイム注釈を付ける必要があります。

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

#[derive(Debug)]
enum HighlightColor {
    Pink,
    Yellow,
}

#[derive(Debug)]
struct Highlight<'document> {
    slice: &'document str,
    color: HighlightColor,
}

fn main() {
    let doc = String::from("The quick brown fox jumps over the lazy dog.");
    let noun = Highlight { slice: &doc[16..19], color: HighlightColor::Yellow };
    let verb = Highlight { slice: &doc[20..25], color: HighlightColor::Pink };
    // drop(doc);
    dbg!(noun);
    dbg!(verb);
}
  • 上の例では、Highlight につけられた注釈により、含まれている &str の元データは、そのデータを使用するどの Highlight のインスタンスと同じだけ、あるいはそれ以上長く生存していなければならないことが保証されます。構造体は、それが参照するデータより長く生存することはできません。
  • noun または verb のライフタイムが終わる前に doc がドロップされると、借用チェッカーはエラーを出します。
  • 借用データを持つ型では、ユーザーは元のデータを保持し続ける必要があります。これは軽量なビューを作成するのに便利ですが、一般にはやや使いにくくなります。
  • 可能であれば、データ構造がそのデータを直接所有するようにしてください。
  • 内部に複数の参照を持つ構造体では、複数のライフタイム注釈が必要になることがあります。これは、構造体自体のライフタイムに加えて、参照同士のライフタイム関係を表現する必要がある場合に必要です。そうしたケースは非常に高度なユースケースです。