2016-02-17 28 views
6

Tôi cố gắng để khởi một mảng của cấu trúc trong Rust với đoạn mã sau đây:Làm cách nào để triển khai tính năng Sao chép?

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. 

Khi tôi biên dịch nó, nó than phiền rằng Copy đặc điểm không được thực hiện.

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

Ai đó có thể chỉ cho tôi đúng hướng để thực hiện đặc điểm sao chép không?

+2

'# [lấy được (Sao chép, Sao chép)]' là đúng cách, nhưng đối với hồ sơ, nó không phải là điều huyền diệu: Thật dễ dàng để thực hiện những đặc điểm đó một cách thủ công, đặc biệt là trong các trường hợp dễ dàng như của bạn: 'impl Copy for Direction { } impl Clone cho Direction {fn clone (& self) -> Self {* self}} ' – delnan

+2

@delnan Ngay cả khi nó ngắn, tôi nghĩ rằng xứng đáng là một câu trả lời dưới đây. Nó hoàn toàn hợp lệ. – Shepmaster

Trả lời

15

Bạn không cần phải thực hiện Copy chính mình, bạn có thể chỉ cần có trình biên dịch lấy được nó cho bạn như sau:

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

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

tại sao "Bản sao" cần thiết? Liệu nó có luôn luôn cần phải được thêm vào nếu một người muốn thực hiện Sao chép không? – xetra11

+3

@ xetra11Yes, 'Clone' là một supertrait của' Copy' vì vậy mọi loại thực hiện 'Copy' cũng cần phải thực hiện' Clone'. – fjh

5

Chỉ cần thêm vào trước #[derive(Copy, Clone)] trước enum của bạn.

Nếu bạn thực sự muốn, bạn cũng có thể

impl Copy for MyEnum {} 

Các lấy được thuộc tính làm điều tương tự dưới mui xe.

Các vấn đề liên quan