Введение
В этом лабе мы узнаем, как использовать трейт Clone в Rust для создания копий ресурсов, таких как структуры, с использованием метода .clone(). Трейт Clone позволяет нам создавать независимые копии ресурсов, и мы можем использовать метод .clone() для создания нового экземпляра с теми же значениями.
Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать
main.rs, скомпилировать и запустить его с помощьюrustc main.rs &&./main.
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!("оригинал: {:?}", 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);
// TODO ^ Попробуйте раскомментировать эту строку
// Клонируем `moved_pair` в `cloned_pair` (включаются ресурсы)
let cloned_pair = moved_pair.clone();
// Удаляем исходную пару с использованием std::mem::drop
drop(moved_pair);
// Ошибка! `moved_pair` уже удалена
//println!("копия: {:?}", moved_pair);
// TODO ^ Попробуйте раскомментировать эту строку
// Результат от `.clone()` по-прежнему можно использовать!
println!("клон: {:?}", cloned_pair);
}
Резюме
Поздравляем! Вы завершили лабу по клонированию. Вы можете практиковаться в других лабах в LabEx, чтобы улучшить свои навыки.