我有一个Rust中的枚举,它有一个值取String:

#[derive(Clone, Copy)]
enum Simple {
    Error(String),
    Okay,
    Foo([u32; 5]),
}

fn main() {
    let x = Simple::Error(String::from("blah"));
    let y = x.clone();
}

上面的枚举值Foo表示我使用的大约10个其他枚举,它们采用可复制的类型或array.编译器似乎没有抱怨它们,只有Error(String)导致了这种情况:

error[E0204]: the trait `Copy` may not be implemented for this type
 --> src/main.rs:1:17
  |
1 | #[derive(Clone, Copy)]
  |                 ^^^^
2 | enum Simple {
3 |     Error(String),
  |           ------ this field does not implement `Copy`
  |

出于某种原因,String是不可复制的.我不明白.我如何为一个枚举实现Clone,只针对一个有问题的类型,而对其余类型使用默认impl?

推荐答案

复制

复制指定在不使原始实例无效的情况下进行按位复制创建有效实例的类型.

对于String来说不是这样,因为String包含一个指向堆上字符串数据的指针,并假定它对该数据拥有唯一的所有权.当您丢弃String时,它会释放堆上的数据.如果您对String进行了位复制,那么两个实例都会try 释放相同的内存块,即undefined behaviour.

因为String没有实现复制your 102 cannot implement 101 either,因为编译器强制复制个类型只由复制个数据成员组成.

克隆

克隆只提供了一个标准的clone方法,如何实现它取决于每个实现者.String实现了克隆,所以你在enum上加了#[derive(克隆)].

Rust相关问答推荐

为什么父作用域中的变量超出了子作用域

从特征实现调用函数的Rust惯用方法

铁 rust 干线无法使用PowerShell获取环境变量

如何在Rust中表示仅具有特定大小的数组

为什么允许我们将可变引用转换为不可变引用?

无法将记录器向下转换回原始 struct

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

如何循环遍历0..V.len()-1何时v可能为空?

告诉Rust编译器返回值不包含构造函数中提供的引用

如何在嵌套的泛型 struct 中调用泛型方法?

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

为什么我们有两种方法来包含 serde_derive?

Rust编译器通过哪些规则来确保锁被释放?

枚举的利基优化如何在 Rust 中工作?

如何递归传递闭包作为参数?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

Abortable:悬而未决的期货?

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

为什么我返回的 impl Trait 的生命周期限制在其输入的生命周期内?