データ構造の生存期間
from 項目14:生存期間を理解しよう
構造体 などの データ構造に参照が含まれている(e.g. スライス)場合、生存期間パラメータ と ライフタイム注釈 は必須 である
∵ 生存期間省略ルール は適用されないため
code:rs
pub struct ReferenceHolder<'a> {
pub index: usize,
pub item: &'a Item,
}
データ構造に複数の 参照 が含まれている場合、適切なライフタイム注釈の組み合わせを選択する必要がある
e.g. 2 つの異なる文字列の部分文字列を参照するケース
code:rs
// 2 つの文字列の両方に存在する部分文字列の位置
pub struct LargestCommonSubstring<'a, 'b> {
pub left: &'a str,
pub right: &'b str,
}
// left と right の両方に存在する最長の部分文字列を見つける
pub fn find_common<'a, 'b>(
left: &'a str,
right: &'b str,
) -> Option<LargestCommonSubstring<'a, 'b>> {
// ...
}
e.g. 1 つの文字列で繰り返される文字列を参照するケース
code:rs
pub struct RepeatedSubstring<'a> {
pub first: &'a str,
pub second: &'a str,
}
pub fn find_repeat<'a>(
s: &'a str,
) -> Option<LargestCommonSubstring<'a> {
// ...
}
単一 / 複数ライフタイム注釈を持つ構造体の違い radish-miyazaki.icon
データ構造のライフタイム注釈は 伝播 する ため、ライフタイム注釈を持つ型を内部に持つデータ構造もまたライフタイム注釈が必要である
code:rs
pub struct RefHolderHolder<'a> {
pub inner: ReferenceHolder<'a>,
}
参照フィールドの生存期間が切れるとデータ構造全体が無効となるため、参照の 生存期間 とデータ構造の生存期間とを一致させるライフタイム注釈の伝播は必要である
しかし、所有者 は全ての生存期間が一致するようにしなければならないため、このようなデータ構造は扱いづらい
そのため、可能な限り「(参照ではなく)内容を所有するデータ構造を用いるようにしよう」
難しい場合、項目8:参照型とポインタ型に慣れよう の スマートポインタ(e.g. Rc)を用いれば、生存期間の制限を解決することができる
#Rust #Effective_Rust_―_Rustコードを改善し、エコシステムを最大限に活用するための35項目