Avatar ·

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