⏳
ライフタイム — Rustコンパイラが参照の有効範囲を追跡する仕組み
'aが何かを一発で理解する
ライフタイムはRustで最も混乱するコンセプトの1つだ。'aという表記を初めて見ると、何これ?となる。
核心はシンプルだ。「この参照はこの範囲内でのみ有効」とコンパイラに伝えるマーカーである。
なぜ必要か
関数が参照を返す時に問題が発生する。返された参照が入力参照のどれと同じ寿命か、コンパイラが推論できない場合がある。その時'aで「この出力はこの入力と同じ寿命」と明示する。
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
これは「xとyの短い方の寿命だけ戻り値が有効」という意味だ。
ライフタイム省略ルール(Elision)
Rust 1.0から3つのルールで大半のライフタイムを省略できるようになった。実際に'aを書く場面は思ったより少ない。構造体に参照を入れる時が最も多いケースだ。
キーポイント
1
全ての参照にライフタイムがある — 大半はコンパイラが自動推論(elision)
2
関数が参照を返す時に入出力の寿命関係を'aで明示
3
構造体に参照を入れる時もライフタイムパラメータ必須
4
コンパイラが'a範囲を超える使用を検出するとエラー
メリット
- ✓ ダングリングポインタをコンパイル時に100%遮断
- ✓ ランタイムコストゼロ — 全検証がコンパイル時
デメリット
- ✗ 'a文法が最初は直感的でない
- ✗ 複雑なライフタイム関係はコード可読性を下げる
ユースケース
パーサー/トークナイザー — 元文字列のスライスを返す関数
キャッシュ構造体 — 元データへの参照を保持