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.
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 memcpy
s, et donc pour Copy
types, le compilateur comprend qu'il n'a pas besoin de tenir compte de ces n coup .
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)
.