¿Por qué en Rust es necesario especificar explícitamente los lifetimes y cómo funcionan?
Soy nuevo en Rust y estoy tratando de entender el concepto de lifetimes. Escribí una función simple que devuelve una referencia a un elemento de un array:
```rust
fn get_first_element(arr: &[i32]) -> &i32 {
&arr[0]
}
```
El compilador lo compiló sin problemas. Pero cuando intenté escribir una función que toma dos referencias y devuelve una de ellas:
```rust
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() { x } else { y }
}
```
Obtuve un error: "missing lifetime specifier". ¿Por qué en el primer caso el compilador lo resolvió solo, y en el segundo requiere una especificación explícita del lifetime? Pensaba que Rust era inteligente y podía inferir todo automáticamente.
Entiendo que los lifetimes son necesarios para prevenir dangling references, pero no entiendo la lógica por la cual en unos casos se infieren y en otros no. Explíquenme, por favor, con ejemplos, cuándo es necesario especificar el lifetime explícitamente y cuándo se puede prescindir de ello. Me interesa especialmente por qué en funciones simples con un solo parámetro...