¿Cuál es la diferencia entre String y str en Rust? ¿Cuándo usar cada uno?
¡Hola, colegas! Empecé a aprender Rust y me topé con un tema muy confuso: las cadenas. En la documentación me encuentro constantemente con `String` y `&str`, pero no logro entender cuál es la diferencia entre ellos y cuándo usar cada tipo.
Escribí un pequeño ejemplo:
```rust
fn main() {
let s1 = "hello"; // ¿esto es str?
let s2 = String::from("hello"); // ¿y esto es String?
println!("{}", s1);
println!("{}", s2);
// ¿Por qué esto funciona?
let s3: &str = &s2;
println!("{}", s3);
// ¿Y esto no?
// let s4: String = s1; // ¡error!
}
```
Veo que `s1` es un literal de cadena, y `s2` se crea mediante `String::from()`. Pero cuando intento asignar `s1` a una variable de tipo `String`, el compilador se queja. Sin embargo, puedo tomar una referencia a `s2` y asignarla a `&str`.
¿Alguien podría explicar en términos simples:
1. ¿Qué es `String` y qué es `str`?
2. ¿Por qué `str` siempre va con un ampersand (`&str`)?
3. ¿En qué situaciones se debe usar `String` y cuándo `&str`?