函式呼叫中的移動

將值傳遞至函式時,該值會指派給函式參數。這麼做會轉移所有權:

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 的所有權。之後,name 就無法在 main 內使用。
  • name 配置的堆積記憶體會在 say_hello 函式結束時釋放。
  • 如果 main 以參照的形式傳送 name (&name),且 say_hello 能以參數的形式接受參照,main 就可以保留所有權。
  • 另外,main 可在首次呼叫 (name.clone()) 中傳遞 name 的克隆。
  • 在 Rust 中,移動語意為預設做法,且強制規定程式設計師必須明確設定克隆,因此不小心建立副本的可能性就會低於在 C++ 中。