如何在不使用复制或克隆的情况下克隆Rust中的结构?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不使用复制或克隆的情况下克隆Rust中的结构?相关的知识,希望对你有一定的参考价值。

如何为这三种结构样式中的每一种创建深层副本?

// A unit struct
struct Thing;

// A tuple struct
struct Thingy(u8, i32);

// regular
struct Location {
    name: String,
    code: i32,
}

我可以不使用CopyClone特征吗?如果已经定义了一个结构并且没有实现这些特性,那么是否有解决方法?

// without this:
#[derive(Copy, Clone)]
struct Location {
    name: String,
    code: i32,
}
答案

单元结构不包含任何数据,因此“深层副本”只是它的另一个实例:let thing_clone = Thing;

对于其他类型,您只需手动克隆字段并从克隆字段中创建新对象。假设有newThingyLocation方法:

let thingy_clone = Thingy::new(thingy.0, thingy.1);

let location_clone = Location::new(location.name.clone(), location.code);

请注意,我只是为String字段显式编写了.clone()。这是因为u8和i32实现了Copy,因此会在需要时自动复制。无需显式复制/克隆。

也就是说,使用Clone特性肯定更加惯用。如果ThingThingyLocation是外部库的一部分,您可以提交错误报告,要求为这些结构实现Clone

以上是关于如何在不使用复制或克隆的情况下克隆Rust中的结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不下载其父文件夹的情况下签出或克隆文件夹

如何在不克隆的情况下复制 List<T>

是否可以在不手动将重写的克隆方法添加到 C++ 中的每个派生类的情况下克隆多态对象?

如何在不克隆的情况下获取子数组

Git:如何在不丢失当前分支的情况下克隆项目?

如何在不克隆它所连接的存储库的情况下触发 Jenkins 构建?