为什么 Rust 需要简单枚举的复制和克隆特征

Pau*_*erg 3 enums rust

除非在枚举中派生出特征,Copy否则以下代码将无法编译。Clone鉴于枚举基本上是 ani8并且根据文档,整数自动实现 Copy 特征,为什么这是一个要求?与此相关的是,由于 的大小MyEnum在编译时应该是众所周知的,所以它不应该进入堆栈吗?这个特性不是Clone意味着它会在堆上吗?

#[derive(Debug, Copy, Clone)]
#[repr(i8)]
enum MyEnum {
    Some1,
}

fn main() {
    let x = MyEnum::Some1;
    let y = x;
    println!("x={:?} y={:?}", x, y);
}
Run Code Online (Sandbox Code Playgroud)

mca*_*ton 7

Clone与堆无关。Clone并不意味着为任何类型进行堆分配,无论它们是structs、enums,也无论它们#[repr]是否具有属性。Clone只是一个正常特征。

而且特征永远不会自动实现,因为在编写库时,这将是公共接口的隐式部分。也就是说,类型可能是隐式的、出乎意料的,Clone而库作者并没有打算创建它Clone。这限制了类型将来的更改方式,并且库作者可能会通过更改类型的内容并丢失隐式特征实现而无意中破坏其公共接口。Rust 总是更喜欢明确的东西而不是隐藏的东西。

  • *并且特征永远不会自动实现* - 标记特征(“发送”、“同步”、“取消固定”)是一个值得注意的例外。 (2认同)