Dev Study
← 解説「ライフタイムとは — 参照の有効期間」に戻る

サンプルコードで身につける: ライフタイムとは — 参照の有効期間

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1参照は値のスコープに収まる

参照 r の有効期間が、指す先の value が生きている範囲にすっぽり収まっている、いちばん健全な形の例です。この形ならライフタイムを意識しなくてもそのままコンパイルが通ります。普段書いているコードのほとんどはこのパターンで、エラーになるのは次の例のような形だけです。

Rust

2ブロックの外へ参照は持ち出せない

内側のブロックから外の値を借りるのは安全ですが、逆にブロック内で作った値への参照を外に持ち出すと「値より参照が長生き」になりコンパイルエラーになる、という対比の例です。コメントを外すと borrowed value does not live long enough というエラーを確認できます。このエラー文はライフタイム違反の典型的なサインです。

Rust

3ローカル変数への参照は返せない

関数のローカル変数は関数の終わりで消えるため、その参照を返すとダングリング参照になりコンパイルが拒否されます。正しい解決策は、参照ではなく String の所有権ごと返すことです。「関数の中で作ったデータは、参照ではなく値で返す」は実務で毎日使う判断基準になります。

Rust

4借用は「最後に使った場所」で終わる

参照の有効期間はスコープの終わりまでではなく、その参照を最後に使った場所までであることを示す例です。r を最後に使った println! の後なら、同じ text を可変借用して書き換えられます。「もう使っていない参照はカウントされない」というこの賢さのおかげで、自然に書いたコードの多くがそのまま通ります。

Rust

5設定行から借りたスライスの有効期間

設定ファイルの1行からキー部分のスライスを切り出す、実務寄りの例です。key_part が返す &str は引数 line の一部を借りているだけなので、元の line が生きている間しか使えません。引数が参照1つだけのこの形は、次のレッスンで学ぶ注釈を書かなくてもコンパイラが関係を推論してくれます。

Rust