Часи життя (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. ─────────────────────────────────────┘
Зверніть увагу, що для позначення часів життя не призначаються жодні імена або типи. Це обмежує те, як часи життя зможуть використовуватися, як ми побачимо.