ライフタイム — 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文法が最初は直感的でない
  • 複雑なライフタイム関係はコード可読性を下げる

ユースケース

パーサー/トークナイザー — 元文字列のスライスを返す関数 キャッシュ構造体 — 元データへの参照を保持