Avatar ·

¿println! toma prestado o toma posesión de una variable en Rust?

¡Hola a todos! Acabo de empezar a aprender Rust y estoy tratando de entender el sistema de ownership. Tengo un código simple: ```rust fn main() { let s = String::from("Hello"); println!("{}", s); println!("{}", s); // Segundo intento de imprimir } ``` Esperaba que después del primer `println!`, la variable `s` se moviera (move) dentro de la macro y se volviera inválida, como ocurre al pasarla a una función que toma `String` por valor. ¡Pero el código funciona! ¿Por qué? He leído que `println!` es una macro, no una función. ¿Quizás se comporta de manera diferente? Si escribiera: ```rust fn print_string(s: String) { println!("{}", s); } fn main() { let s = String::from("Hello"); print_string(s); print_string(s); // Error: use of moved value } ``` — obtendría un error de compilación. Pero con `println!` todo funciona. ¿Significa esto que `println!` toma prestada la variable, en lugar de tomar posesión? ¿O la clona automáticamente? Por favor, explíquenme.