ライフタイム
ライフタイムはコンパイラ(具体的にはボローチェッカー)が、すべての借用に 問題がないことを確認するために使う仕組みです。具体的には、変数のライフタイムは 作られたときに始まり、破棄されたときに終わります。ライフタイムとスコープはしばしば 同じ扱いをされますが、同じではありません。
例えば、変数を&で借用した場合を考えます。この借用はライフタイムを持ち、
宣言されたときに始まり、貸し手が破棄されるまで続きます。しかし、借用のスコープ
は参照が使われるときに決まります。
以下の例や残りの節で、ライフタイムはスコープとどのように関係し、 どのように異なるのかを見ていきます。
// 以下では、各変数に対するライフタイムを線で表します // `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`が終わる。─────────────────────────────────────┘│ // │ } // ライフタイムが終わる。─────────────────────────────────────┘
ライフタイムのラベルにはいかなる名前、型も代入できないことに注意してください。 この制限によって、ライフタイムはうまく使えるようになります。