Клонирование структур Rust с использованием трейта Clone

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом лабе мы узнаем, как использовать трейт 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, чтобы улучшить свои навыки.