Эта проблема, по-видимому, подразумевает ее только как деталь реализации (memcpy
vs???), но я не могу найти никаких явных описание различий.
В чем разница между Copy и Clone?
Ответ 1
Clone
предназначен для произвольного дублирования: реализация Clone
для типа T
может выполнять произвольно сложные операции, необходимые для создания нового T
. Это нормальная черта (отличная от прелюдии), поэтому ее нужно использовать как обычный признак, с вызовами методов и т.д. Характеристика Copy
представляет значения, которые можно безопасно дублировать с помощью memcpy
: такие вещи, как переназначения и передача аргумента по значению в функцию всегда memcpy
s, и поэтому для типов Copy
компилятор понимает, что нет необходимости рассматривать те ход.
Ответ 2
Основное отличие состоит в том, что клонирование является явным. Неявная нотация означает перемещение для типа не 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.
Кстати, каждый тип Copy
также должен быть Clone
. Однако они не обязаны делать то же самое! Для ваших собственных типов .clone()
может быть произвольным методом по вашему выбору, тогда как неявное копирование всегда запускает реализацию memcpy
, а не clone(&self)
.