移動語意

An assignment will transfer ownership between variables:

fn main() {
    let s1: String = String::from("Hello!");
    let s2: String = s1;
    println!("s2: {s2}");
    // println!("s1: {s1}");
}
  • s1 指派給 s2 會轉移所有權。
  • When s1 goes out of scope, nothing happens: it does not own anything.
  • s2 超出範圍時,系統會釋放字串資料。
  • 一律「只有」一個變數綁定會擁有值。
  • 請說明這與 C++ 中的預設情形相反:您必須使用 std::move,且已定義移動建構函式,系統才會根據值進行複製。

  • 只有擁有權才會轉移。是否產生任何機器碼來操控資料本身是一個最優化問題,而系統會主動將這些副本最優化。

  • 簡單的值 (例如整數) 可標示為 Copy (請參閱後續投影片)。

  • 在 Rust 中,克隆作業皆為明確設定,方法為使用 clone