为什么 Rust 需要 Copy 和 Clone 特性来实现简单的枚举

Why does Rust require Copy and Clone traits for simple enum

除非在枚举中导出 CopyClone 特征,否则以下代码将无法编译。鉴于枚举基本上是 i8according to the documentation,整数自动实现 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);
}

Clone与堆无关。 Clone 并不意味着任何类型的 heap-allocated,无论它们是 struct 还是 enum,无论它们是否具有 #[repr] 属性。 Clone只是一个正常的特征。

并且特征不会自动实现,永远不会,因为在编写库时,这将是 public 接口的隐式部分。也就是说,一个类型可能是隐式的,出乎意料的,Clone 而库作者并不打算使它成为 Clone。这限制了类型在未来的变化方式,并且库作者可能会通过更改类型的内容并丢失隐式特征实现而无意中破坏他们的 public 接口。 Rust 总是更喜欢显式而不是隐藏的东西。