2015-06-23 11 views

risposta

56

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.

+1

Posso capire come 'Clone' è un deep-copy, e' Copy' è shadow-copy? – Djvu

+0

'Clone' apre la * possibilità * che il tipo possa fare una copia profonda o superficiale:" arbitrariamente complicato ". – poolie

41

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).

+1

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

Problemi correlati