函数调用中的移动

你将值传递给函数时,该值会被赋给函数 参数。这就转移了所有权:

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 分配的堆内存。
  • 如果 mainname 作为引用 (&name) 传递过去,且 say_hello 接受作为参数的引用,则可保留所有权。
  • 此外,main 也可以在首次调用时传递 name 的克隆 (name.clone())。
  • 相较于 C++,Rust 通过将移动语义设为默认值,并强制程序员进行显式克隆,更难以无意中创建副本。