println! 在 Rust 中是借用还是夺取变量所有权?
大家好!我刚开始学习 Rust,正在尝试理解所有权系统。我有一个简单的代码:
```rust
fn main() {
let s = String::from("Hello");
println!("{}", s);
println!("{}", s); // 第二次尝试输出
}
```
我原本以为在第一次 `println!` 之后,变量 `s` 会被移动(move)到宏内部并失效,就像传递给一个按值接受 `String` 的函数一样。但代码能运行!为什么?
我读到 `println!` 是一个宏,而不是函数。也许它的行为不同?如果我写:
```rust
fn print_string(s: String) {
println!("{}", s);
}
fn main() {
let s = String::from("Hello");
print_string(s);
print_string(s); // 错误:use of moved value
}
```
——就会得到编译错误。但用 `println!` 一切正常。这是否意味着 `println!` 借用了变量,而不是夺取所有权?或者它自动克隆了变量?请解释一下,谢谢!