Avatar ·

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`?