函数调用中的移动
你将值传递给函数时,该值会被赋给函数 参数。这就转移了所有权:
fn say_hello(name: String) { println!("Hello {name}") } fn main() { let name = String::from("Alice"); say_hello(name); // say_hello(name); }
- 首次调用
say_hello时,main便放弃了name的所有权。此后,main中不能再使用name。 - 在
say_hello函数结束时,系统会释放为name分配的堆内存。 - 如果
main将name作为引用 (&name) 传递过去,且say_hello接受作为参数的引用,则可保留所有权。 - 此外,
main也可以在首次调用时传递name的克隆 (name.clone())。 - 相较于 C++,Rust 通过将移动语义设为默认值,并强制程序员进行显式克隆,更难以无意中创建副本。