¿Qué son los tiempos de vida no léxicos (non-lexical lifetimes) en Rust?
¡Hola, colegas! Empecé a estudiar Rust recientemente y me topé con el concepto de tiempos de vida (lifetimes). Parece que entendí lo básico: el compilador verifica que las referencias no queden colgando, y para eso usa anotaciones como `'a`.
Pero constantemente me encuentro con el término "non-lexical lifetimes" (NLL). Honestamente, de la documentación oficial no me queda del todo claro en qué se diferencian de los tiempos de vida "léxicos" normales. Estoy acostumbrado a que el tiempo de vida de una variable está definido por su ámbito de visibilidad — un bloque entre llaves `{}`. Por ejemplo:
```rust
fn main() {
let r; // ---------+-- 'a
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
println!("{}", r); // |
} // ---------+
```
Aquí todo tiene sentido: `r` hace referencia a `x`, pero `x` solo vive dentro del bloque, por lo que el compilador se queja. Eso es un tiempo de vida léxico.
Pero entonces, ¿qué...