如何实现Rust的Copy特性?

teh*_*yit 21 traits rust

我想在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]; 
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,编译器抱怨该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
Run Code Online (Sandbox Code Playgroud)

如何Copy实施这一特性?

fjh*_*fjh 33

你不必Copy自己实施; 编译器可以为您派生它:

#[derive(Copy, Clone)]
enum Direction {
    North,
    East,
    South,
    West,
}

#[derive(Copy, Clone)]
struct RoadPoint {
    direction: Direction,
    index: i32,
}
Run Code Online (Sandbox Code Playgroud)

请注意,实现的每个类型也Copy必须实现Clone.Clone也可以派生出来.

  • @ xetra11是的,`Clone`是`Copy`的超级版本,因此每个实现`Copy`的类型都需要实现`Clone`. (6认同)
  • 这不完全是一个答案,但我更喜欢派生“克隆”而不派生“复制”。它允许开发人员显式地对元素执行“.clone()”,但它不会为您执行此操作(这是“Copy”的工作)。所以至少“Clone”有一个与“Copy”分开存在的理由;我会更进一步假设“Clone”实现了该方法,但“Copy”使其自动化,两者之间没有冗余。 (5认同)
  • 为什么需要“克隆”?如果要实施复制,是否总是需要添加它? (2认同)

llo*_*giq 10

只是#[derive(Copy, Clone)]在你的枚举之前.

如果你真的想要,你也可以

impl Copy for MyEnum {}
Run Code Online (Sandbox Code Playgroud)

derive-attribute在幕后做同样的事情.