Avatar ·

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

Olá a todos! Comecei a estudar Rust recentemente e notei algo estranho. Em alguns exemplos de código, vejo funções que aceitam parâmetros como `&String`, `&Vec` ou `&Box`. Isso parece lógico — afinal, queremos passar uma referência para não copiar os dados. Mas depois me deparei com a recomendação de que não se deve fazer isso. Por quê? Afinal, são apenas referências! Aqui está um exemplo que escrevi: ```rust fn print_string(s: &String) { println!("{}", s); } fn print_vec(v: &Vec) { for i in v { println!("{}", i); } } fn main() { let my_string = String::from("Hello"); let my_vec = vec![1, 2, 3]; print_string(&my_string); print_vec(&my_vec); } ``` Esse código funciona, mas ouvi dizer que é melhor usar `&str` em vez de `&String` e `&[T]` em vez de `&Vec`. Por quê? Afinal, `&String` e `&Vec` já são referências, elas não possuem os dados. Qual é o problema? Existe alguma diferença de desempenho ou algo mais? Expliquem, por favor, em palavras simples.