我在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个其他枚举类型,它们接受可复制的类型或这些类型的数组。编译器似乎对它们没有抱怨,只有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
,只针对其中一个有问题的类型呢?
Copy
指定了能够通过位拷贝创建有效实例的类型*。复制这种字符串的比特位不会增加原子计数器,因为这不再是复制。你可以自行选择需要的保证。你可以共享所有权,跨线程共享所有权,实现写时复制等。对于系统语言来说,为您做出这个决定(并加重代码负担)是不好的。 - Shepmaster位拷贝
是使用memcpy
或类似函数进行的所有字节的浅层复制。它与成员逐一复制、位逐一复制和浅层复制不同。 - MG lolenstineCopy
,因为只能执行一次释放操作,否则会出现双重释放。如果你可以复制字符串,那么哪个实例将负责释放缓冲区呢?你所描述的基本上是Cow<str>
或Rc<str>
,它们也因为同样的原因不能是Copy
:你需要正确调用drop
来管理缓冲区并最终释放它。 - undefined