Времена жизни
Время жизни - это конструкция, которую компилятор (или более конкретно, его анализатор заимствований) использует, чтобы убедиться, что все заимствования действительны. В частности время жизни переменной начинается с момента её создания и заканчивается когда она уничтожается. Времена жизни и области видимости упоминаются часто вместе, но они не совпадают.
Возьмём, например, случай когда мы заимствуем переменную через &
.
Срок действия заимствования определяется местом его объявления.
В результате, заимствование действительно до тех пор,
пока оно не закончится или пока кредитор не будет уничтожен. Однако,
область заимствования определяется местом использования ссылки.
В следующем примере и в остальной части этого раздела мы увидим, как времена жизни связаны с областями видимости, а также как они различаются.
// Времена жизни аннотированы линиями, обозначающими // создание и уничтожение каждой переменной. // `i` имеет самое длинное время жизни, так как его область охватывает // полностью оба заимствования `borrow1` и `borrow2`. // Продолжительность заимствования `borrow1` по сравнению с // заимствованием `borrow2` не имеет значения, так как они не пересекаются. 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. ─────────────────────────────────────┘
Обратите внимание, что для меток времени жизни не назначаются имена или типы. Это ограничивает то, как время жизни будет использоваться, как мы увидим далее.