使用 Clone 特性克隆 Rust 结构体

Beginner

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

简介

在本实验中,我们将学习如何在 Rust 中使用 Clone 特性,通过 .clone() 方法来复制结构体等资源。Clone 特性使我们能够创建资源的独立副本,并且可以使用 .clone() 方法创建一个具有相同值的新实例。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用 main.rs,并通过 rustc main.rs &&./main 进行编译和运行。

克隆

在处理资源时,默认行为是在赋值或函数调用期间转移它们。然而,有时我们也需要复制资源。

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 丢弃原始的 pair
    drop(moved_pair);

    // 错误!`moved_pair` 已经被丢弃
    //println!("副本:{:?}", moved_pair);
    // TODO ^ 尝试取消注释这一行

    // 来自.clone() 的结果仍然可以使用!
    println!("克隆:{:?}", cloned_pair);
}

总结

恭喜你!你已经完成了克隆实验。你可以在 LabEx 中练习更多实验来提升你的技能。