明示的な注釈
借用チェッカーは、参照がどれだけ長く有効であるべきかを判断するために、明示的なライフタイム注釈を使用します。ライフタイムが省略されない1場合、Rust は参照のライフタイムがどうあるべきかを判断するために、明示的な注釈を要求します。ライフタイムを明示的に注釈する構文では、次のようにアポストロフィ文字を使用します。
foo<'a>
// `foo` はライフタイムパラメーター `'a` を持つ
クロージャと同様に、ライフタイムを使用するにはジェネリクスが必要です。さらに、このライフタイム構文は、foo のライフタイムが 'a のライフタイムを超えてはならないことを示します。型の明示的な注釈は、'a がすでに導入されている場合に &'a T という形式になります。
複数のライフタイムがある場合、構文は似ています。
foo<'a, 'b>
// `foo` はライフタイムパラメーター `'a` と `'b` を持つ
この場合、foo のライフタイムは 'a または 'b のいずれのライフタイムも超えることはできません。
明示的なライフタイム注釈の使用例を次に示します。
// `print_refs` は、それぞれ異なるライフタイム `'a` と `'b` を持つ // `i32` への参照を 2 つ受け取る。これら 2 つのライフタイムはどちらも、 // 少なくとも関数 `print_refs` と同じ長さでなければならない。 fn print_refs<'a, 'b>(x: &'a i32, y: &'b i32) { println!("x is {} and y is {}", x, y); } // 引数は取らないが、ライフタイムパラメーター `'a` を持つ関数。 fn failed_borrow<'a>() { let _x = 12; // エラー: `_x` の生存期間が十分に長くない let _y: &'a i32 = &_x; // 関数内でライフタイム `'a` を明示的な型注釈として使用しようとすると // 失敗する。これは、`&_x` のライフタイムが `_y` のライフタイムよりも // 短いためである。短いライフタイムを長いライフタイムへ強制変換することはできない。 } fn main() { // 以下で借用される変数を作成する。 let (four, nine) = (4, 9); // 両方の変数の借用 (`&`) が関数に渡される。 print_refs(&four, &nine); // 借用される入力はすべて、借用者よりも長く生存しなければならない。 // つまり、`four` と `nine` のライフタイムは // `print_refs` のライフタイムよりも長くなければならない。 failed_borrow(); // `failed_borrow` には、`'a` を関数のライフタイムよりも // 長く強制する参照は含まれていないが、`'a` はより長い。 // ライフタイムが一度も制約されないため、デフォルトで `'static` になる。 }