ライフタイム

ライフタイムはコンパイラ(具体的にはボローチェッカー)が、すべての借用に 問題がないことを確認するために使う仕組みです。具体的には、変数のライフタイムは 作られたときに始まり、破棄されたときに終わります。ライフタイムとスコープはしばしば 同じ扱いをされますが、同じではありません。

例えば、変数を&で借用した場合を考えます。この借用はライフタイムを持ち、 宣言されたときに始まり、貸し手が破棄されるまで続きます。しかし、借用のスコープ は参照が使われるときに決まります。

以下の例や残りの節で、ライフタイムはスコープとどのように関係し、 どのように異なるのかを見ていきます。

// 以下では、各変数に対するライフタイムを線で表します
// `i`は`borrow1`と`borrow2`のスコープを完全に含むため、
// 一番長いです。`borrow1`と`borrow2`のライフタイムは
// 重なりません。
fn main() {
    let i = 3; // `i`のライフタイムが始まる。─────────────────────┐
    //                                                            │
    { //                                                          │
        let borrow1 = &i; // `borrow1`のライフタイムが始まる。───┐│
        //                                                       ││
        println!("borrow1: {}", borrow1); //                     ││
    } // `borrow1が終わる。──────────────────────────────────────┘│
    //                                                            │
    //                                                            │
    { //                                                          │
        let borrow2 = &i; // `borrow2`のライフタイムが始まる。───┐│
        //                                                       ││
        println!("borrow2: {}", borrow2); //                     ││
    } // `borrow2`が終わる。─────────────────────────────────────┘│
    //                                                            │
}   // ライフタイムが終わる。─────────────────────────────────────┘

ライフタイムのラベルにはいかなる名前、型も代入できないことに注意してください。 この制限によって、ライフタイムはうまく使えるようになります。