Типаж Clone
При работе с ресурсами, стандартным поведением является передача их (ресурсов) в ходе выполнения или вызов функции. Однако, иногда нам нужно также объявить копию ресурса.
Типаж Clone
помогает нам сделать именно это. Чаще всего, мы можем использовать метод .clone()
объявленный типажом Clone
.
// Единичная структура без ресурсов #[derive(Debug, Clone, Copy)] struct Unit; // Кортежная структура с ресурсами, которая реализует типаж `Clone` #[derive(Clone, Debug)] struct Pair(Box<i32>, Box<i32>); fn main() { // Создадим экземпляр `Unit` let unit = Unit; // Скопируем `Unit`, который не имеет ресурсов для перемещения let copied_unit = unit; // Оба `Unit` могут быть использованы независимо println!("original: {:?}", unit); println!("copy: {:?}", copied_unit); // Создадим экземпляр `Pair` let pair = Pair(Box::new(1), Box::new(2)); println!("original: {:?}", pair); // Переместим `pair` в `moved_pair`, перемещая и ресурсы let moved_pair = pair; println!("moved: {:?}", moved_pair); // Ошибка! Переменная `pair` потеряла свои ресурсы //println!("original: {:?}", pair); // ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку // Клонируем `moved_pair` в `cloned_pair` (включая ресурсы) let cloned_pair = moved_pair.clone(); // Удалим исходную пару, используя std::mem::drop drop(moved_pair); // Ошибка! `moved_pair` была удалена //println!("copy: {:?}", moved_pair); // ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку // Результат, полученный из .clone(), все ещё можно использовать! println!("clone: {:?}", cloned_pair); }