Avatar ·

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