Fácil Rust
Função com lifetime explícito
Enunciado
Escreva uma função melhor<'a>(x: &'a str, y: &'a str) -> &'a str que retorna a string mais longa. Se tiverem o mesmo tamanho, retorne x. No main, chame a função com duas strings literais e imprima o resultado.
Requisitos
- A função deve ter o parâmetro de lifetime
'aexplícito. - Deve retornar a string mais longa ou
xem caso de empate. - O
maindeve chamar a função e imprimir o resultado.
Código inicial
fn melhor<'a>(x: &'a str, y: &'a str) -> &'a str {
// implemente
}
fn main() {
// chame e imprima
}
Saída esperada
Mais longa: rust
Ver dica
Use if x.len() >= y.len() { x } else { y }.
Mostrar solução
// Função que retorna a string mais longa, com lifetime explícito.
fn melhor<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() >= y.len() { x } else { y }
}
fn main() {
let a = "rust";
let b = "go";
println!("Mais longa: {}", melhor(a, b));
}
Passo a passo
- Declaramos
fn melhor<'a>(x: &'a str, y: &'a str) -> &'a str. O'aé um parâmetro de lifetime genérico que liga as duas entradas e a saída. - Dentro da função, comparamos os comprimentos com
x.len() >= y.len(). - Se
xfor maior ou igual, retornamosx; caso contrário,y. - No
main, criamos duas variáveis&stre chamamosmelhor(a, b). - O compilador verifica que o retorno não vive mais que
aeb, o que é verdade. - Imprimimos o resultado com
println!.
Por que funciona
O lifetime 'a garante que a referência retornada é válida enquanto ambas as entradas forem válidas. Como as strings literais têm lifetime 'static, o retorno também pode ser usado sem problemas. O compilador não permite retornar uma referência a uma variável local que morre no fim da função.
Erros comuns
- Omitir o lifetime e escrever
fn melhor(x: &str, y: &str) -> &str. O compilador não consegue inferir qual entrada o retorno segue; erromissing lifetime specifier. - Retornar
&Stringem vez de&str: o tipo precisa ser consistente. - Usar
x.len() > y.len()sem tratar empate, contrariando o enunciado.
Outra forma de resolver
Você pode usar std::cmp::max_by_key com uma closure, mas precisa de lifetimes explícitos do mesmo jeito:
fn melhor<'a>(x: &'a str, y: &'a str) -> &'a str {
std::cmp::max_by_key(x, y, |s| s.len())
}
Essa forma é mais declarativa, porém menos direta para iniciantes.
Saída esperada
Mais longa: rust