Avatar ·

println! empresta ou toma posse da variável em Rust?

Olá a todos! Comecei a estudar Rust e estou tentando entender o sistema de posse. Tenho um código simples: ```rust fn main() { let s = String::from("Hello"); println!("{}", s); println!("{}", s); // Segunda tentativa de imprimir } ``` Eu esperava que após o primeiro `println!` a variável `s` fosse movida (move) para dentro da macro e se tornasse inválida, como acontece ao passar para uma função que recebe `String` por valor. Mas o código funciona! Por quê? Li que `println!` é uma macro, não uma função. Talvez ela se comporte de forma diferente? Se eu escrevesse: ```rust fn print_string(s: String) { println!("{}", s); } fn main() { let s = String::from("Hello"); print_string(s); print_string(s); // Erro: use of moved value } ``` — receberia um erro de compilação. Mas com `println!` funciona. Isso significa que `println!` empresta a variável, em vez de tomar posse? Ou ela a clona automaticamente? Expliquem, por favor.