2016-02-17 30 views
6

मैं निम्नलिखित स्निपेट के साथ जंग में structs की एक सरणी आरंभ करने के लिए कोशिश कर रहा हूँ:मैं कॉपी विशेषता को कैसे कार्यान्वित करूं?

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. 

जब मैं यह संकलन, यह शिकायत है कि Copy विशेषता लागू नहीं है।

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

क्या कोई मुझे प्रतिलिपि विशेषता लागू करने के लिए सही दिशा में इंगित कर सकता है?

+2

'# [व्युत्पन्न (क्लोन, कॉपी)] 'सही तरीका है, लेकिन रिकॉर्ड के लिए, यह जादुई नहीं है: उन लक्षणों को मैन्युअल रूप से कार्यान्वित करना आसान है, खासकर आपके जैसे आसान मामलों में:' impl निर्देश के लिए प्रतिलिपि { } निहितार्थ के लिए क्लोन {एफएन क्लोन (और स्वयं) -> स्वयं {* स्वयं}} ' – delnan

+2

@ डेलनन अगर यह छोटा है, तो मुझे लगता है कि नीचे एक उत्तर होना चाहिए। यह पूरी तरह से मान्य है। – Shepmaster

उत्तर

15

आप आप बस के रूप में इस संकलक यह तुम्हारे लिए प्राप्त हो सकता है Copy खुद को लागू करने की जरूरत नहीं है,:

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

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

"क्लोन" क्यों आवश्यक है? अगर कोई प्रतिलिपि लागू करना चाहता है तो क्या इसे हमेशा जोड़ा जाना चाहिए? – xetra11

+3

@ xetra11Yes, 'क्लोन' 'प्रतिलिपि' का एक सुपरर्ट्रेट है, इसलिए 'कॉपी' को लागू करने वाले प्रत्येक प्रकार को 'क्लोन' को लागू करने की भी आवश्यकता है। – fjh

5

बस आगे जोड़ते #[derive(Copy, Clone)] अपने enum से पहले।

आप वास्तव में चाहते हैं, तो आप भी कर सकते हैं

impl Copy for MyEnum {} 

निकाले जाते हैं-विशेषता हुड के नीचे एक ही बात करता है।

संबंधित मुद्दे