Avatar ·

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!` 借用了变量,而不是夺取所有权?或者它自动克隆了变量?请解释一下,谢谢!