Day 1:所有權三大規則

學習目標

  • 背熟所有權三大規則
  • 理解「所有權轉移(move)」
  • 知道 move 對變數效力的影響

今日重點

三大規則(必背)

  1. 每個值都有一個變數,稱為它的「擁有者(owner)」
  2. 同一時間只能有一個擁有者
  3. 擁有者**離開範圍(scope)時**,值會被**丟棄並釋放記憶體**

所有權轉移(Move)

let s1 = String::from("hello");
let s2 = s1;              // s1 的所有權「移動」到 s2
// println!("{}", s1);     // 錯誤!s1 已無效(已被 move)
println!("{}", s2);        // 正確

Strings1 = s2 不是複製內容,而是**移動**。s1 之後不再有效。

為什麼不複製?

  • 若每次都深拷貝整個字串,效能很差
  • Rust 選擇「移動所有權 + 編譯期檢查」,避免懸垂指標,又保有零成本

離開範圍

{
    let s = String::from("hello");
}   // s 在這裡離開範圍,記憶體自動釋放

練習

  1. 試著在 move 之後印出 s1,讀懂編譯錯誤訊息。
  2. clone() 保留兩份,比較跟 move 的差別。
    let s3 = String::from("hello");
    let s4 = s3.clone();       // 深拷貝,兩者都有效
    println!("{} and {}", s3, s4);
    

自我檢查

  • 能背出所有權三大規則
  • 理解 let s2 = s1; 會使 s1 失效
  • 知道 clone() 與 move 的差別

深入連結

  • The Book 第 4 章「Ownership」