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