2015-06-23 10 views

Odpowiedz

56

Clone przeznaczony jest dla dowolnych duplikacji: a Clone realizacja dla typu T można zrobić dowolnie skomplikowane operacje wymagane do utworzenia nowego T. Jest normalną cechę (innego niż bycie w preludium), a więc wymaga używana jak normalna cecha, z wywołań metod itp

Copy cecha reprezentuje wartości, które mogą być bezpiecznie powielane poprzez memcpy: rzeczy jak nadpisywaniem i przekazywanie argumentu za wartością do funkcji jest zawsze memcpy s, a więc dla typów Copy, kompilator rozumie, że nie musi brać pod uwagę tych a move.

+1

Czy mogę zrozumieć, że 'Klon' to kopia głęboka, a' Kopiuj' to kopia w tle? – Djvu

+0

'Klon' otwiera * możliwość *, że typ może wykonać głęboką lub płytką kopię:" dowolnie skomplikowany ". – poolie

41

Główna różnica polega na tym, że klonowanie jest jawne. Zapis niejawny oznacza przenoszenie dla typu innego niż 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. 

Nawiasem mówiąc, każdy Copy typ jest również muszą być Clone. Jednak nie są zobowiązani do zrobienia tego samego! Dla własnych typów, .clone() może być dowolną dowolną metodą, podczas gdy niejawne kopiowanie zawsze wyzwala implementację memcpy, a nie clone(&self).

+1

Cool! To wyjaśnia drugie pytanie, które miałem odnośnie tego, czy cecha Klona zapewnia niejawne kopiowanie. Okazuje się, że to pytanie i ten był bardziej powiązany, niż myślałem. Dzięki! – user12341234

Powiązane problemy