明示的アノテーション

借用チェッカーは参照がどれだけの間有効かを決定するために、明示的なアノテーションを使用します。ライフタイムが省略1されなかった場合、Rustは参照のライフタイムがどのようなものであるか、明示的なアノテーションを必要とします。

foo<'a>
// `foo`は`'a`というライフタイムパラメータを持ちます。

クロージャと同様、ライフタイムの使用はジェネリクスを必要とします。もう少し詳しく言うと、この書き方は「fooのライフタイムは'aのそれを超えることはない。」ということを示しており、型を明示した場合'a&'a Tとなるということです。

ライフタイムが複数ある場合も、同じような構文になります。

foo<'a, 'b>
// `foo`は`'a`と`'b`というライフタイムパラメータを持ちます。

この場合は、fooのライフタイムは'a'bいずれよりも 長くなってはなりません。

以下はライフタイムを明示的に書く場合の例です。

// `print_refs`は`i32`への参照を2つとり、それぞれ`'a`と`'b`という
// ライフタイムを持ちます。これらのライフタイムは最短でも`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;
    // `&_x`のライフタイムは`y`のそれよりも短いため、関数内で`'a`を使用して
    // 変数のライフタイムを指定しようとすると失敗します。つまり、短いライフタイム
    // を持つ参照をより長いものに強制的に代入することはできません。
}

fn main() {
    // 下で借用するための変数を作成。
    let (four, nine) = (4, 9);
    
    // 2つの変数の借用(`&`)が関数に渡されます。
    print_refs(&four, &nine);
    // 借用された変数の寿命は、借り手のそれよりも長くなくてはなりません。
    // つまり、`four`、`nine`のライフタイムは`print_refs`のそれよりも
    // 長くなくてはなりません。
    
    failed_borrow();
    // `failed_borrow`は関数のライフタイムよりも`'a`を長くさせるような
    // 参照を持ちませんが、それでも`'a`のほうが長くなります。なぜならそのような
    // 場合`'a`はデフォルトで`'static`になるからです。
}
1

省略 はライフタイムが暗黙のうちに(プログラマから見えない形で)アノテートされることを指します。

参照

ジェネリクス, クロージャ