ライフタイム
ライフタイム_とは、すべての借用が有効であることを保証するためにコンパイラ(より具体的には、その_借用チェッカー)が使用する仕組みです。具体的には、変数のライフタイムは作成時に始まり、破棄時に終わります。ライフタイムとスコープはしばしば一緒に言及されますが、同じものではありません。
たとえば、& を介して変数を借用する場合を考えてみましょう。その借用には、宣言された場所によって決まるライフタイムがあります。その結果、借用は、貸し出し元が破棄される前に終了する限り有効です。ただし、借用のスコープは、その参照が使用される場所によって決まります。
次の例とこのセクションの残りの部分では、ライフタイムがスコープとどのように関係するか、また両者がどのように異なるかを見ていきます。
// 以下では、各変数の作成と破棄を示す線でライフタイムを注釈しています。 // `i` のスコープは `borrow1` と `borrow2` の両方を完全に囲んでいるため、 // `i` のライフタイムが最も長くなります。`borrow1` と `borrow2` は互いに交わらないため、 // `borrow2` と比較した `borrow1` の期間は関係ありません。 fn main() { let i = 3; // `i` のライフタイムが始まる。────────────┐ // │ { // │ let borrow1 = &i; // `borrow1` のライフタイムが始まる。┐│ // ││ println!("borrow1: {}", borrow1); // ││ } // `borrow1` が終了する。────────────────────────────┘│ // │ // │ { // │ let borrow2 = &i; // `borrow2` のライフタイムが始まる。┐│ // ││ println!("borrow2: {}", borrow2); // ││ } // `borrow2` が終了する。────────────────────────────┘│ // │ } // ライフタイムが終了する。─────────────────────────────┘
ライフタイムにラベルを付けるために、名前や型が割り当てられることはない点に注意してください。 以降で見るように、これによってライフタイムの利用方法が制限されます。