web-dev-qa-db-fra.com

Comment puis-je implémenter le trait Copie de Rust?

J'essaie d'initialiser un tableau de structures dans 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]; 

Lorsque j'essaye de compiler, le compilateur se plaint que le trait Copy n'est pas implémenté:

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

Comment le trait Copy peut-il être implémenté?

28
tehnyit

Vous n'avez pas à implémenter Copy vous-même; le compilateur peut le dériver pour vous:

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

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

Notez que chaque type qui implémente Copy doit également implémenter Clone . Clone peut également être dérivé.

28
fjh

Ajoutez simplement #[derive(Copy, Clone)] avant votre énumération.

Si vous voulez vraiment, vous pouvez aussi

impl Copy for MyEnum {}

L'attribut derive fait la même chose sous le capot.

10
llogiq