我正在尝试在 Rust 中初始化一个结构数组:
enum Direction {
North,
East,
South,
West,
}
struct RoadPoint {
direction: Direction,
index: i32,
}
// Initialise the array, but failed.
let data = [RoadPoint { direction: Direction::East, index: 1 }; 4];
当我尝试编译时,编译器抱怨 Copy
特征未实现:
error[E0277]: the trait bound `main::RoadPoint: std::marker::Copy` is not satisfied
--> src/main.rs:15:16
|
15 | let data = [RoadPoint { direction: Direction::East, index: 1 }; 4];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `main::RoadPoint`
|
= note: the `Copy` trait is required because the repeated element will be copied
如何实现 Copy
特征?
#[derive(Clone, Copy)]
是正确的方法,但为了记录,它并不神奇:手动实现这些特征很容易,尤其是在像您这样的简单情况下:impl Copy for Direction {} impl Clone for Direction { fn clone(&self) -> Self { *self } }
只需在您的枚举之前添加 #[derive(Copy, Clone)]
。
如果你真的想要,你也可以
impl Copy for MyEnum {}
派生属性在引擎盖下做同样的事情。
Clone
是Copy
的超特征,因此每个实现Copy
的类型也需要实现Clone
。Clone
而不 推导Copy
。它允许开发人员明确地对元素执行.clone()
,但它不会为您执行(这是Copy
的工作)。所以至少有一个理由让Clone
与Copy
分开存在;我会更进一步,假设Clone
实现了该方法,但Copy
使其自动化,两者之间没有冗余。