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:?}"); }
- 指派後,
p1
和p2
都會擁有自己的資料。 - 我們也能使用
p1.clone()
明確複製資料。
This slide should take about 5 minutes.
複製和克隆並不相同:
- 複製是指記憶體區域的按位元複製作業,不適用於任意物件。
- 複製不允許用於自訂邏輯,這與 C++ 中的複製建構函式不同。
- 克隆是較廣泛的作業,而且只要實作
Clone
特徵,即允許用於自訂行為。 - 複製不適用於實作
Drop
特徵的型別。
在上述範例中,請嘗試下列操作:
- 將
String
欄位新增至struct Point
。由於String
不屬於Copy
型別,因此不會編譯。 - Remove
Copy
from thederive
attribute. The compiler error is now in theprintln!
forp1
. - 示範如果改為克隆
p1
,就能正常運作。