Copy
Похоже на Clone, но показывает, что тип можно побитово скопировать.
Можно получить через derive: ✅
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
#[derive(Debug, Clone, Copy)]
pub struct Copyable(u8, u16, u32, u64);
fn main() {
let copyable = Copyable(1, 2, 3, 4);
let copy = copyable; // Неявная операция копирования
dbg!(copyable);
dbg!(copy);
}
-
Clone— явная, определяемая пользователем операция копирования.Copy— неявное побитовое копирование. -
Обычно его стоит реализовывать только для типов «простых данных», которые должны вести себя как примитивные значения. Например, примитивные числовые типы для библиотеки линейной алгебры.
-
Здесь то же предостережение, что и для
Clone: если дублирование значений нарушит инвариант, тип не должен реализовыватьCopy. -
Всегда получайте
CloneиCopyчерез derive вместе! Не реализуйтеCloneвручную, когда реализуетеCopy.- Операции копирования не вызывают метод
clone, поэтому пользовательская реализацияCloneможет вести себя иначе, чем неявное копирование. Получение обоих трейтовCloneиCopyчерез derive гарантирует, что вызовcloneдаст тот же результат, что и копирование.
- Операции копирования не вызывают метод
-
Нельзя реализовать для типов с
Dropили с полями, которые не реализуютCopy.-
Спросите класс: почему тип с данными в куче (
Vec,BTreeMap,Rcи т. п.) не может бытьCopy?Побитовое копирование для этих типов означало бы, что типы с данными в куче больше не обладали бы эксклюзивным владением указателем, что нарушило бы инварианты, которые обычно поддерживают Rust и его экосистема.
Несколько
Vecуказывали бы на одни и те же данные в памяти. Добавление и удаление данных обновляли бы значения длины и ёмкости только у отдельныхVec. То же самое дляBTreeMap.Побитовое копирование
Rcне обновило бы значение счётчика ссылок внутри указателей, а значит, могло бы быть два экземпляраRc, каждый из которых считает себя единственнымRcдля этого указателя. Когда один из них уничтожится, счётчик ссылок у него станет 0, и внутреннее значение будет освобождено, хотя другойRcвсё ещё жив.
-