Всем привет! Ну совсем не понимаю эту тему. я ее здесь 100 раз перечитал так и не понял http://rurust.github.io/rust_book_ru/src/lifetimes.html
Может какие-ниубдь легкие короткие примеры кто приведет?
Время жизни — это имя Области видимости, оно используется, чтобы избежать такой ситуации во время выполнения:
- Мы получаем абстрактную ссылку на какой-то ресурс.
- Мы одалживаем вам ссылку на этот ресурс.
- Мы решаем, что ресурс нам больше не требуется, и освобождаем его, в то время как у вас все еще есть на него ссылка.
- Вы решаете использовать этот ресурс.
Например:
- Вы открыли счёт в банке, положили туда деньги (владеете ресурсом).
- Вы выпустили карточку (получили ссылку на ресурс).
- Вы передали карточку супруге (одолжили ссылку на ресурс).
- Вы сняли деньги и закрыли счёт (освободили ресурс).
- Супруга пытается воспользоваться карточкой (использование после освобождения).
Rust предлагает абстракцию с нулевой стоимостью (с проверкой на этапе компиляции), чтобы подобное не происходило в вашей программе во время выполнения. В главе, на которую вы сослались, есть пример, показывающий как работает время жизни:
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let x; // -+ x входит в область видимости
// |
{ // |
let y = &5; // ---+ y входит в область видимости
let f = Foo { x: y }; // ---+ f входит в область видимости
x = &f.x; // | | здесь ошибка
} // ---+ f и y выходят из области видимости
// |
println!("{}", x); // |
} // -+ x выходит из области видимости
Как вы можете видеть здесь, области видимости f
и y
меньше, чем область видимости x
. Но когда мы выполняем x = &f.x
, мы присваиваем x
ссылку на что-то, что вот-вот выйдет из области видимости и будет освобождено.
Присвоение имени времени жизни — это способ задать имя области видимости. Чтобы думать о чём-то, нужно иметь название для этого.