Por que as vidas explícitas são necessárias no Rust?
Eu estava lendo ocapítulo das vidas do livro Rust e me deparei com este exemplo por um tempo de vida nomeado / explícito:
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
É bastante claro para mim que o erro que está sendo impedido pelo compilador é ousar após livre da referência atribuída ax
: depois que o escopo interno for concluído,f
e portanto&f.x
tornar-se inválido e não deveria ter sido atribuído ax
.
Meu problema é que o problema poderia ter sido facilmente analisadosem usando oexplícito 'a
vida útil, por exemplo, deduzindo uma atribuição ilegal de uma referência a um escopo mais amplo (x = &f.x;
)
Em quais casos as vidas explícitas são realmente necessárias para evitar erros de uso após liberação (ou de alguma outra classe?)?