データ構造とライフタイム
データ型が借用データを内部に保持する場合、ライフタイムアノテーションを付ける必要があります。
#[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
が使用されると、借用チェッカーはエラーをスローします。- 消費したデータが含まれる型では、ユーザーは元のデータを保持せざるを得なくなります。これは軽量のビューを作成する場合に便利ですが、一般的には使いにくくなります。
- 可能であれば、データ構造がデータを直接所有できるようにします。
- 内部に複数の参照がある構造体には、複数のライフタイム アノテーションが含まれる場合があります。これが必要になるのは、構造体自体のライフタイムだけでなく、参照同士のライフタイムの関係を記述する必要がある場合です。これは非常に高度なユースケースです。