Как я могу реализовать черту 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?

Ответ 1

Вам не нужно реализовывать Copy самостоятельно; компилятор может получить его для вас:

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

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

Обратите внимание, что каждый тип, который реализует Copy, должен также реализовывать Clone. Clone также может быть получено.

Ответ 2

Просто представьте #[derive(Copy, Clone)] перед перечислением.

Если вы действительно хотите, вы также можете

impl Copy for MyEnum {}

Атрибут getive делает то же самое под капотом.