Avatar ·

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