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

Часи життя (lifetimes)

Час життя (lifetime) — це конструкція, яку компілятор (точніше, його перевірник запозичень (borrow checker)) використовує, щоб переконатися, що всі запозичення є дійсними. Зокрема, час життя змінної починається, коли її створено, і закінчується, коли її знищено. Хоча часи життя та області видимості часто згадують разом, це не одне й те саме.

Візьмемо, наприклад, випадок, коли ми запозичуємо змінну через &. Запозичення має час життя, який визначається тим, де його оголошено. У результаті запозичення є дійсним доти, доки воно завершується до знищення позичальника. Однак область видимості запозичення визначається тим, де використовується посилання.

У наступному прикладі та в решті цього розділу ми побачимо, як часи життя пов’язані з областями видимості, а також чим ці двоє відрізняються.

// Lifetimes are annotated below with lines denoting the creation
// and destruction of each variable.
// `i` has the longest lifetime because its scope entirely encloses
// both `borrow1` and `borrow2`. The duration of `borrow1` compared
// to `borrow2` is irrelevant since they are disjoint.
fn main() {
    let i = 3; // Lifetime for `i` starts. ────────────────┐
    //                                                     │
    { //                                                   │
        let borrow1 = &i; // `borrow1` lifetime starts. ──┐│
        //                                                ││
        println!("borrow1: {}", borrow1); //              ││
    } // `borrow1` ends. ─────────────────────────────────┘│
    //                                                     │
    //                                                     │
    { //                                                   │
        let borrow2 = &i; // `borrow2` lifetime starts. ──┐│
        //                                                ││
        println!("borrow2: {}", borrow2); //              ││
    } // `borrow2` ends. ─────────────────────────────────┘│
    //                                                     │
}   // Lifetime ends. ─────────────────────────────────────┘

Зверніть увагу, що для позначення часів життя не призначаються жодні імена або типи. Це обмежує те, як часи життя зможуть використовуватися, як ми побачимо.