如何在不使用Copy或Clone的情况下在Rust中克隆结构体?

gcuhipw9  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(241)

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

// A unit struct
struct Thing;

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

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

我可以在不使用CopyClone特性的情况下执行此操作吗?如果一个结构体已经被定义了,但是还没有实现这些trait,有没有解决方法?

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

hyrbngr71#

一个单元结构体不包含任何数据,所以一个“深拷贝”只是它的另一个示例:let thing_clone = Thing;
对于其他类型,您只需手动克隆字段并从克隆的字段创建一个新对象。假设ThingyLocation都有new方法:

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 trait肯定更符合习惯。如果ThingThingyLocation是外部库的一部分,您可以提交错误报告,要求为这些结构体实现Clone

相关问题