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
- 1. Qual è la differenza tra copia e clonazione?
- 2. Qual è la differenza tra una copia superficiale e una copia profonda con array JavaScript?
- 3. Qual è la differenza tra = e: =
- 4. Qual è la differenza tra Verilog! e ~?
- 5. Qual è la differenza tra? : e ||
- 6. qual è la differenza tra [[], []] e [[]] * 2
- 7. Qual è la differenza tra $ e $$?
- 8. Qual è la differenza tra ("") e (null)
- 9. Qual è la differenza tra dict() e {}?
- 10. Qual è la differenza tra " " e ""?
- 11. Qual è la differenza tra {0} e ""?
- 12. Qual è la differenza tra `##` e `hashCode`?
- 13. Qual è la differenza tra {0} e +?
- 14. Qual è la differenza tra .ToString() e + ""
- 15. qual è la differenza tra:.! e: r !?
- 16. Qual è la differenza tra la clonazione e la copia di un repository git?
- 17. Qual è la differenza tra underscore clone() e simple '='?
- 18. Qual è la differenza tra l'installazione di un modulo perl e la copia dell'intera cartella?
- 19. Qual è la differenza tra destroy() e unpersist()?
- 20. Qual è la differenza tra console.dir e console.log?
- 21. Qual è la vera differenza tra ACTION_GET_CONTENT e ACTION_OPEN_DOCUMENT?
- 22. Qual è la differenza tra "è Nessuno" e "== Nessuno"
- 23. Unix: Qual è la differenza tra la fonte e l'esportazione?
- 24. Qual è la differenza tra il callback e la promessa
- 25. Qual è la differenza tra la sezione .got e .got.plt?
- 26. Qual è la differenza tra la lista() e []
- 27. Qual è la differenza tra GHC e la piattaforma Haskell?
- 28. Qual è la differenza tra sé e la finestra?
- 29. Qual è la differenza tra la cartella vim72 e vimfiles?
- 30. Qual è la differenza tra la serratura e RLock
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