web-dev-qa-db-ja.com

RustのCopyトレイトを実装するにはどうすればよいですか?

私は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トレイトはどのように実装できますか?

28
tehnyit

Copy を自分で実装する必要はありません。コンパイラはあなたのためにそれを導き出すことができます:

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

#[derive(Copy, Clone)]
struct RoadPoint {
    direction: Direction,
    index: i32,
}

Copyを実装するすべての型は Clone も実装する必要があることに注意してください。 Cloneも導出できます。

28
fjh

列挙型の前に#[derive(Copy, Clone)]を追加するだけです。

あなたが本当に望むなら、あなたもできます

impl Copy for MyEnum {}

Derive-attributeは内部で同じことを行います。

10
llogiq