Copy 型別

雖然移動語意是預設做法,但某些型別的預設做法為複製:

fn main() {
    let x = 42;
    let y = x;
    println!("x: {x}"); // would not be accessible if not Copy
    println!("y: {y}");
}

這些型別會實作 Copy 特徵。

您可以自行選擇加入型別,使用複製語意的做法:

#[derive(Copy, Clone, Debug)]
struct Point(i32, i32);

fn main() {
    let p1 = Point(3, 4);
    let p2 = p1;
    println!("p1: {p1:?}");
    println!("p2: {p2:?}");
}
  • 指派後,p1p2 都會擁有自己的資料。
  • 我們也能使用 p1.clone() 明確複製資料。
This slide should take about 5 minutes.

複製和克隆並不相同:

  • 複製是指記憶體區域的按位元複製作業,不適用於任意物件。
  • 複製不允許用於自訂邏輯,這與 C++ 中的複製建構函式不同。
  • 克隆是較廣泛的作業,而且只要實作 Clone 特徵,即允許用於自訂行為。
  • 複製不適用於實作 Drop 特徵的型別。

在上述範例中,請嘗試下列操作:

  • String 欄位新增至 struct Point。由於 String 不屬於 Copy 型別,因此不會編譯。
  • Remove Copy from the derive attribute. The compiler error is now in the println! for p1.
  • 示範如果改為克隆 p1,就能正常運作。