This issue sembra implicare che è solo un dettaglio di implementazione (memcpy
vs ???), ma non riesco a trovare alcuna descrizione esplicita delle differenze.Qual è la differenza tra Copia e Clona?
risposta
Clone
è progettato per duplicazioni arbitrari: un'implementazione Clone
per un tipo T
può fare operazioni complicate arbitrariamente necessari per creare un nuovo T
. È una caratteristica normale (oltre ad essere nel preludio), e quindi richiede di essere usato come un tratto normale, con chiamate di metodo, ecc
Il Copy
tratto rappresenta valori che possono essere duplicati in modo sicuro tramite memcpy
: cose come riassegnazioni e passando un argomento per valore a una funzione sono sempre memcpy
s, e quindi per i tipi Copy
, il compilatore capisce che non è necessario prendere in considerazione quelli a move.
La differenza principale è che la clonazione è esplicita. Notazione implicita significa spostare per un tipo 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.
proposito, ogni tipo Copy
è anche richiesto di essere Clone
. Tuttavia, non sono tenuti a fare la stessa cosa! Per i tuoi tipi, .clone()
può essere un metodo arbitrario di tua scelta, mentre la copia implicita attiverà sempre un'implementazione memcpy
, non l'clone(&self)
.
Fantastico! Questo chiarisce una domanda secondaria che avevo riguardo al fatto che il tratto Clone fornisca una copia implicita. Risulta quella domanda e questa era più correlata di quanto pensassi. Grazie! – user12341234
Posso capire come 'Clone' è un deep-copy, e' Copy' è shadow-copy? – Djvu
'Clone' apre la * possibilità * che il tipo possa fare una copia profonda o superficiale:" arbitrariamente complicato ". – poolie