2015-06-23 128 views

回答

56

Clone是專爲任意重複:一個Clone實施一種T可以做創建一個新的T需要任意複雜的操作。這是一種正常的特徵(除前奏之外),因此需要像正常特徵一樣使用方法調用等。

Copy特徵代表可通過memcpy安全複製的值:諸如重新分配之類的東西並且將一個參數傳遞給一個函數總是memcpy s,對於Copy類型,編譯器明白它不需要考慮那些a move

+1

我可以理解爲「克隆」是一個深層複製,而「複製」是影子複製? – Djvu

+0

'克隆'打開*可能性*類型可能做一個深層或淺層的副本:「任意複雜」。 – poolie

41

主要區別在於克隆是明確的。隱式符號表示移動到非Copy類型。

// u8 implements Copy 
let x: u8 = 123; 
let y = x; 
// x can still be used 
println!("x={}, y={}", x, y); 

// Vec<u8> implements Clone, but not Copy 
let v: Vec<u8> = vec![1, 2, 3]; 
let w = v.clone(); 
//let w = v // This would *move* the value, rendering v unusable. 

順便說一句,每個Copy類型也必須是Clone。但是,他們不需要做同樣的事情!對於您自己的類型,.clone()可以是您選擇的任意方法,而隱式複製將始終觸發memcpy,而不是clone(&self)實現。

+1

酷!這清除了我關於Clone特徵是否提供隱式複製的第二個問題。發現這個問題,這個問題比我想象的更多。謝謝! – user12341234