rust - ps4 - ¿Cuál es la diferencia entre Copy y Clone?
rust traduccion (2)
La principal diferencia es que la clonación es explícita.
La notación implícita significa movimiento para un tipo que no sea
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.
Por cierto, también se requiere que cada tipo de
Copy
sea
Clone
.
Sin embargo, ¡no están obligados a hacer lo mismo!
Para sus propios tipos,
.clone()
puede ser un método arbitrario de su elección, mientras que la copia implícita siempre activará una
memcpy
, no de
clone(&self)
.
Este problema
parece implicar que es solo un detalle de implementación (
memcpy
vs ???), pero no puedo encontrar ninguna descripción explícita de las diferencias.
Clone
está diseñado para duplicaciones arbitrarias: una implementación de
Clone
para un tipo
T
puede realizar operaciones complicadas arbitrariamente necesarias para crear una nueva
T
Es un rasgo normal (aparte de estar en el preludio), por lo que requiere ser utilizado como un rasgo normal, con llamadas a métodos, etc.
El rasgo
Copy
representa valores que se pueden duplicar de forma segura a través de
memcpy
: cosas como reasignaciones y pasar un argumento por valor a una función siempre son
memcpy
s, por lo que para los tipos de
Copy
, el compilador entiende que no necesita considerar esos
moverse