为什么 Rust 需要 Copy 和 Clone 特性来实现简单的枚举
Why does Rust require Copy and Clone traits for simple enum
除非在枚举中导出 Copy
和 Clone
特征,否则以下代码将无法编译。鉴于枚举基本上是 i8
和 according 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 总是更喜欢显式而不是隐藏的东西。
除非在枚举中导出 Copy
和 Clone
特征,否则以下代码将无法编译。鉴于枚举基本上是 i8
和 according 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 总是更喜欢显式而不是隐藏的东西。