Типаж Clone

При работе с ресурсами, стандартным поведением является передача их (ресурсов) в ходе выполнения или вызов функции. Однако, иногда нам нужно также объявить копию ресурса.

Типаж Clone помогает нам сделать именно это. Чаще всего, мы можем использовать метод .clone() объявленный типажом Clone.

// Единичная структура без ресурсов

#[derive(Debug, Clone, Copy)]

struct Unit;

// Кортежная структура с ресурсами, которая реализует типаж `Clone`

#[derive(Clone, Debug)]

struct Pair(Box, Box);

fn main() {

// Объявим экземпляр `Unit`

let unit = Unit;

// Скопируем `Unit`, который не имеет ресурсов для перемещения

let copied_unit = unit;

// Оба `Unit` могут быть использованы независимо

println!("оригинал: {:?}", unit);

println!("копия: {:?}", copied_unit);

// Объявим экземпляр `Pair`

let pair = Pair(Box::new(1), Box::new(2));

println!("оригинал: {:?}", pair);

// Скопируем `pair` в `moved_pair`, перенаправляя ресурсы

let moved_pair = pair;

println!("копия: {:?}", moved_pair);

// Ошибка! `pair` потеряла свои ресурсы

//println!("оригинал: {:?}", pair);

// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку

// Скопируем `moved_pair` в `cloned_pair` (включая ресурсы)

let cloned_pair = moved_pair.clone();

// Сбросим оригинальную пару используя std::mem::drop

drop(moved_pair);

// Ошибка! `moved_pair` была сброшена

//println!("копия: {:?}", moved_pair);

// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку

// Полученный результат из .clone() все ещё можно использовать!

println!("клон: {:?}", cloned_pair);

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Загрузка...