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.