¿Cuál es la diferencia entre String y str en Rust?
¡Hola! Acabo de empezar a aprender Rust y me encontré con confusión entre `String` y `str`. En otros lenguajes, como Python o JavaScript, las cadenas son solo cadenas, pero aquí hay una especie de zoológico.
Escribí este código:
```rust
fn main() {
let greeting = "Hello"; // ¿Esto es str?
let name = String::from("World"); // ¿Y esto es String?
println!("{} {}", greeting, name);
// Intenté modificar greeting
// greeting.push_str("!"); // ¡Error!
// Pero name se puede modificar
name.push_str("!"); // Funciona
println!("{}", name);
}
```
Entiendo que `String` se puede modificar, pero `str` no. ¿Pero por qué? ¿Cuándo usar cada tipo? ¿Y qué es `&str`? He visto que en las funciones a menudo escriben `&str`, pero no entiendo por qué.
También noté que `str` no tiene un tamaño conocido en tiempo de compilación, mientras que `String` sí. ¿Esto tiene que ver con que las cadenas se almacenan en el heap? Ayúdame a entender, porque ya me estoy volviendo loco.