函式呼叫中的移動
將值傳遞至函式時,該值會指派給函式參數。這麼做會轉移所有權:
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++ 中。