函数调用中的移动
你将值传递给函数时,该值会被赋给函数 参数。这就转移了所有权:
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 通过将移动语义设为默认值,并强制程序员进行显式克隆,更难以无意中创建副本。