Я читал часть жизни книги Rust, и я наткнулся на этот пример для именованного/явного времени жизни:
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let x; // -+ x goes into scope
// |
{ // |
let y = &5; // ---+ y goes into scope
let f = Foo { x: y }; // ---+ f goes into scope
x = &f.x; // | | error here
} // ---+ f and y go out of scope
// |
println!("{}", x); // |
} // -+ x goes out of scope
Мне совершенно ясно, что ошибка, предотвращаемая компилятором, - это использование без ссылки ссылки, назначенной x
: после выполнения внутренней области f
и, следовательно, &f.x
становятся недействительными, и не должен был быть назначен x
.
Моя проблема в том, что проблему можно было легко проанализировать без использования явного времени жизни 'a
, например, выведя незаконное назначение ссылки на более широкую область (x = &f.x;
).
Итак, в каких случаях явные жизненные времена действительно необходимы для предотвращения ошибок после использования (или некоторых других классов?)?