O que são non-lexical lifetimes (NLL) em Rust?
Olá, colegas! Comecei a estudar Rust recentemente e me deparei com o conceito de lifetimes. Acho que entendi o básico: o compilador verifica se as referências não estão soltas e, para isso, usa anotações como `'a`.
Mas constantemente encontro o termo "non-lexical lifetimes" (NLL). Sinceramente, pela documentação oficial não ficou totalmente claro para mim como eles diferem dos lifetimes "lexicais" comuns. Estou acostumado que o lifetime de uma variável é definido pelo seu escopo — um bloco entre chaves `{}`. Por exemplo:
```rust
fn main() {
let r; // ---------+-- 'a
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
println!("{}", r); // |
} // ---------+
```
Aqui tudo faz sentido: `r` referencia `x`, mas `x` vive apenas dentro do bloco, então o compilador reclama. Isso é um lifetime lexical.
Mas o que então