Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ライフタイム

ライフタイム_とは、すべての借用が有効であることを保証するためにコンパイラ(より具体的には、その_借用チェッカー)が使用する仕組みです。具体的には、変数のライフタイムは作成時に始まり、破棄時に終わります。ライフタイムとスコープはしばしば一緒に言及されますが、同じものではありません。

たとえば、& を介して変数を借用する場合を考えてみましょう。その借用には、宣言された場所によって決まるライフタイムがあります。その結果、借用は、貸し出し元が破棄される前に終了する限り有効です。ただし、借用のスコープは、その参照が使用される場所によって決まります。

次の例とこのセクションの残りの部分では、ライフタイムがスコープとどのように関係するか、また両者がどのように異なるかを見ていきます。

// 以下では、各変数の作成と破棄を示す線でライフタイムを注釈しています。
// `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` が終了する。────────────────────────────┘│
    //                                                     │
}   // ライフタイムが終了する。─────────────────────────────┘

ライフタイムにラベルを付けるために、名前や型が割り当てられることはない点に注意してください。 以降で見るように、これによってライフタイムの利用方法が制限されます。