Qual é a diferença entre String e str em Rust? Quando usar cada um?
Olá, colegas! Comecei a estudar Rust e me deparei com um tópico muito confuso — strings. Na documentação, encontro constantemente `String` e `&str`, mas não consigo entender qual é a diferença entre eles e quando usar cada tipo.
Escrevi um pequeno exemplo:
```rust
fn main() {
let s1 = "hello"; // isto é str?
let s2 = String::from("hello"); // e isto é String?
println!("{}", s1);
println!("{}", s2);
// Por que isto funciona?
let s3: &str = &s2;
println!("{}", s3);
// E isto não?
// let s4: String = s1; // erro!
}
```
Eu vejo que `s1` é um literal de string, e `s2` é criado via `String::from()`. Mas quando tento atribuir `s1` a uma variável do tipo `String`, o compilador reclama. No entanto, posso pegar uma referência a `s2` e atribuí-la a `&str`.
Alguém pode explicar em termos simples:
1. O que é `String` e o que é `str`?
2. Por que `str` sempre vem com um ampersand (`&str`)?
3. Em quais situações devo usar `String` e em quais devo usar `&str`?