Avatar ·

Por que não é recomendado usar &String, &Vec e &Box como argumentos de funções em Rust?

Olá a todos! Recentemente comecei a estudar Rust e notei uma coisa estranha: em muitos tutoriais e no Stack Overflow escrevem que não se deve escrever funções que aceitam `&String`, `&Vec` ou `&Box`. Em vez disso, recomendam usar `&str`, `&[T]` e simplesmente `&T` (ou `&T` para Box). Mas não entendo bem qual é o problema. Aqui está um exemplo simples que escrevi para trabalhar com texto: ```rust fn print_length(s: &String) { println!("Comprimento da string: {}", s.len()); } fn main() { let my_string = String::from("Olá, mundo!"); print_length(&my_string); } ``` Este código funciona. Por que é considerado um estilo ruim? O que torna `&String` pior que `&str`? E o mesmo com vetores: o que torna `&Vec` pior que `&[i32]`? Afinal, em ambos os casos estou passando uma referência, não a posse. O que me confunde é que, se eu escrever uma função com `&str`, ao chamá-la com `String` terei que fazer a conversão explícita toda vez: `print_length(&my_string[..])` ou `print_length(my_string.as_str())`. Já com `&String` funciona diretamente.