2016-02-17 10 views
6

Sto cercando di inizializzare un array di struct a Rust con il seguente frammento di codice:Come si implementa il tratto Copia?

enum Direction { 
    North, 
    East, 
    South, 
    West, 
} 

struct RoadPoint { 
    direction: Direction, 
    index: i32, 
} 

let data = [RoadPoint { direction: Direction::East, index: 1 }; 4]; // Initialise the array, but failed. 

Quando compilo esso, lamenta il fatto che il tratto Copy non è implementata.

<anon>:44:16: 44:67 error: the trait `core::marker::Copy` is not implemented for the type `main::RoadPoint` [E0277] 
    <anon>:44  let data = [RoadPoint { direction: Direction::East, index: 1 }; 4]; 

Qualcuno può indicarmi la giusta direzione per implementare un tratto di copia?

+2

'# [derive (Clone, Copy)]' è la strada giusta, ma per la cronaca, non è magico: è facile implementare queste caratteristiche manualmente, specialmente in casi facili come il tuo: 'impl Copy for Direction { } impl Clone for Direction {fn clone (& self) -> Self {* self}} ' – delnan

+2

@delnan Anche se è breve, penso che meriti di essere una risposta qui sotto. È totalmente valido – Shepmaster

risposta

15

Non è necessario implementare Copy se stessi, si può solo avere il compilatore derivano per voi come segue:

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

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

perché è necessario il "Clone"? Ha sempre bisogno di essere aggiunto se si vuole implementare la copia? – xetra11

+3

@ xetra11Yes, 'Clone' è una supertrait di' Copia' quindi ogni tipo che implementa 'Copia' deve anche implementare' Clone'. – fjh

5

Basta anteporre #[derive(Copy, Clone)] prima enum.

Se si vuole veramente, è anche possibile

impl Copy for MyEnum {} 

Il derivano attributo fa la stessa cosa sotto il cofano.

Problemi correlati