Avatar ·

En Rust: ¿cuál es la diferencia entre clone() y to_owned() y cuándo usar cada uno?

¡Hola, colegas! Empecé a estudiar Rust hace poco y constantemente me confundo con los métodos clone() y to_owned(). Parece que ambos crean una copia de los datos, pero en la documentación dice que son cosas diferentes. En la práctica, veo que clone() se puede llamar en cualquier tipo que implemente el trait Clone, mientras que to_owned() solo en tipos con el trait ToOwned. Pero, ¿no es lo mismo? Aquí hay un ejemplo concreto que me desconcierta: ```rust let s: &str = "hello"; let a: String = s.to_owned(); let b: String = s.to_string(); // también funciona // ¿Por qué no puedo escribir s.clone() para obtener un String? // ¡Porque clone() devuelve &str, no String! ``` Otro ejemplo: trabajo con slices. Tengo &[i32] y quiero obtener Vec. Puedo hacer slice.to_owned() — funciona. Pero si hago slice.clone(), obtengo otra vez &[i32], no Vec. ¿Por qué? Me parece que to_owned() es un método mágico que "convierte" datos prestados en datos propietarios. Mientras que clone() simplemente copia.