明示的アノテーション

The borrow checker uses explicit lifetime annotations to determine how long references should be valid. In cases where lifetimes are not elided1, Rust requires explicit annotations to determine what the lifetime of a reference should be. The syntax for explicitly annotating a lifetime uses an apostrophe character as follows:

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

Similar to closures, using lifetimes requires generics. Additionally, this lifetime syntax indicates that the lifetime of foo may not exceed that of 'a. Explicit annotation of a type has the form &'a T where 'a has already been introduced.

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

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

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

参照

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