Подтвердить что ты не робот

В чем разница между Copy и Clone?

Эта проблема, по-видимому, подразумевает ее только как деталь реализации (memcpy vs???), но я не могу найти никаких явных описание различий.

4b9b3361

Ответ 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).