2016-02-17 4 views
6

Ich versuche, ein Array von Strukturen in Rust mit dem folgenden Code-Snippet zu initialisieren:Wie implementiere ich das Copy-Merkmal?

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. 

Wenn ich es kompilieren, es beschwert sich, dass die Copy Eigenschaft nicht implementiert.

<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]; 

Kann mir jemand in die richtige Richtung zeigen, ein Kopiermerkmal zu implementieren?

+2

'# [ableiten (Klonen, Kopieren)]' ist der richtige Weg, aber für die Aufzeichnung ist es nicht magisch: Es ist einfach, diese Merkmale manuell zu implementieren, besonders in einfachen Fällen wie dem Ihren: 'impl Copy for Direction { } impl Klon für Richtung {fn Klon (& selbst) -> Selbst {* selbst}} ' – delnan

+2

@delnan Auch wenn es kurz ist, denke ich, dass es verdient, eine Antwort unten zu sein. Es ist absolut gültig. – Shepmaster

Antwort

15

Sie müssen Copy nicht selbst implementieren, können Sie haben nur der Compiler es für Sie wie folgt ab:

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

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

Warum wird der "Clone" benötigt? Muss es immer hinzugefügt werden, wenn man Copy implementieren will? – xetra11

+3

@ Xetra11Ja, 'Clone' ist ein Supertrait von' Copy', also muss jeder Typ, der 'Copy' implementiert, auch' Clone' implementieren. – fjh

5

Gerade prepend #[derive(Copy, Clone)] vor Ihrer ENUM.

Wenn Sie wirklich wollen, können Sie auch

impl Copy for MyEnum {} 

Das derive-Attribut macht das Gleiche unter der Haube.

Verwandte Themen