web-dev-qa-db-fra.com

Quelle est la différence entre Copy et Clone?

Ce problème semble impliquer qu'il ne s'agit que d'un détail d'implémentation (memcpy vs ???), mais je ne trouve aucune description explicite des différences.

95
user12341234

Clone est conçu pour les duplications arbitraires: une implémentation de Clone pour un type T peut effectuer arbitrairement des opérations compliquées nécessaires à la création d'un nouveau T. C'est un trait normal (autre que d'être dans le prélude), et nécessite donc d'être utilisé comme un trait normal, avec des appels de méthode, etc.

Le trait Copy représente des valeurs qui peuvent être dupliquées en toute sécurité via memcpy: des opérations telles que les réaffectations et le passage d’un argument à une fonction sont toujours memcpys, et donc pour Copy types, le compilateur comprend qu'il n'a pas besoin de tenir compte de ces n coup .

95
huon

La principale différence est que le clonage est explicite. La notation implicite signifie déplacer pour un type non -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.

À propos, chaque type Copy doit également être Clone. Cependant, ils ne sont pas obligés de faire la même chose! Pour vos propres types, .clone() peut être une méthode arbitraire de votre choix, tandis que la copie implicite déclenchera toujours une implémentation memcpy, et non pas clone(&self).

66
mdup