Por que no Rust é necessário especificar explicitamente os lifetimes e como eles funcionam?
Sou novo no Rust e estou tentando entender o conceito de lifetimes. Escrevi uma função simples que retorna uma referência a um elemento de array:
```rust
fn get_first_element(arr: &[i32]) -> &i32 {
&arr[0]
}
```
O compilador compilou isso sem problemas. Mas quando tentei escrever uma função que recebe duas referências e retorna uma delas:
```rust
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() { x } else { y }
}
```
Recebi um erro: "missing lifetime specifier". Por que no primeiro caso o compilador resolveu sozinho, mas no segundo exige a especificação explícita do lifetime? Eu pensei que o Rust fosse inteligente e pudesse inferir tudo automaticamente.
Entendo que os lifetimes são necessários para evitar dangling references, mas não entendo a lógica pela qual em alguns casos eles são inferidos e em outros não. Explique, por favor, com exemplos, quando é necessário especificar o lifetime explicitamente e quando pode ser omitido. Estou especialmente interessado em por que em funções simples com um único parâmetro