Dev Study
← 解説「ライフタイム注釈 — <'a>」に戻る

サンプルコードで身につける: ライフタイム注釈 — <'a>

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

12つの参照から1つを返す最小の注釈

2つの &i32 のうち大きい方の参照を返す、注釈のいちばん素朴な例です。戻り値が x と y のどちらになるか実行するまで分からないため、<'a> で「戻り値は両方の引数と同じ期間生きる参照」と宣言します。この「どちらか分からないから両方に同じ名前を付ける」が注釈の出発点です。

Rust

2戻り値に関係する引数だけ注釈する

戻り値が text の一部だと決まっているなら、'a を付けるのは text だけでよいことを示す例です。label は表示に使うだけで戻り値と無関係なので、注釈なしの &str のままにできます。「戻り値がどの引数から来るか」を注釈で正確に伝えるほど、呼び出し側の制約が緩くなります。

Rust

3結果の有効期間は短い方に揃う

同じ 'a を付けた2つの引数の寿命が違うとき、戻り値は「短く生きる方」と同じ期間しか使えないことを示す例です。result はブロック内の short_lived を指す可能性があるため、ブロックの中でしか使えません。longest の結果を長く持ち回そうとしてエラーになったら、この揃え方を思い出してください。

Rust

4ジェネリクスとライフタイムを並べる

<'a, T: PartialOrd> のように、ライフタイムパラメータと型パラメータを同じ山括弧に並べた例です。書く位置も使い方もジェネリクスの <T> と同じ仕組みで、'a は「型の代わりに期間」を表すと整理できます。f64 でも String でも同じ関数が使え、ジェネリクスとの相性の良さが分かります。

Rust

5設定値のフォールバックを参照のまま返す

「設定値が空ならデフォルト値を使う」という実務頻出の処理を、コピーせず参照のまま返す例です。戻り値は value か default のどちらかなので、両方に同じ 'a を付けて関係を宣言します。String を複製して返す書き方より無駄がなく、ライフタイム注釈が実利につながる典型例です。

Rust