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.