2014-11-21 16 views
6

एक सरणी वाली संरचना घोषित करने का अनुशंसित तरीका क्या है, और फिर शून्य-प्रारंभिक उदाहरण बनाएं?जंग में एक सरणी युक्त संरचना को कैसे प्रारंभ करें?

use std::default::Default; 
use std::num; 

#[deriving(Default)] 
struct Histogram { 
    sum: u32, 
    bins: [u32, ..256], 
} 

और संकलक त्रुटि:

यहाँ struct है

src/lib.rs:17:5: 17:23 error: the trait `core::default::Default` is not implemented for the type `[u32, ..256]` 
src/lib.rs:17  bins: [u32, ..256], 
        ^~~~~~~~~~~~~~~~~~ 
note: in expansion of #[deriving] 
src/lib.rs:14:1: 14:21 note: expansion site 
src/lib.rs:17:5: 17:23 note: the trait `core::default::Default` must be implemented because it is required by `core::default::Default::default` 
src/lib.rs:17  bins: [u32, ..256], 
        ^~~~~~~~~~~~~~~~~~ 
note: in expansion of #[deriving] 
src/lib.rs:14:1: 14:21 note: expansion site 
error: aborting due to previous error 

अगर मैं uint8 सरणी के लिए याद आ रही प्रारंभकर्ता जोड़ने का प्रयास:

impl Default for [u32,..256] { 
    fn default() -> [u32,..255]{ 
     [0u8,..256] 
    } 
} 

मैं :

src/lib.rs:20:1: 24:2 error: cannot provide an extension implementation where both trait and type are not defined in this crate [E0117] 
src/lib.rs:20 impl Default for [u32,..256] { 
src/lib.rs:21  fn default() -> [u32,..255]{ 
src/lib.rs:22   [0u8,..256] 
src/lib.rs:23  } 
src/lib.rs:24 } 

क्या मैं कुछ गलत कर रहा हूं, या क्या मैं मानक पुस्तकालय में 1.0 से सड़क पर संख्यात्मक प्रकार के लिए मंथन करके काट रहा हूं?

$ rustc --version 
rustc 0.13.0-nightly 

उत्तर

3

जंग सभी सरणियों के लिए Default को लागू नहीं करता है क्योंकि यह गैर प्रकार बहुरूपता नहीं है, के रूप में ऐसी Default आकार की एक मुट्ठी भर के लिए ही कार्यान्वयन योग्य है।

impl Default for Histogram { 
    fn default() -> Histogram { 
     Histogram { 
      sum: 0, 
      bins: [0u32, ..256], 
     } 
    } 
} 

नोट::

हालांकि, आप एक डिफ़ॉल्ट अपने प्रकार के लिए लागू कर सकते हैं मैं, संघर्ष होता है कि लागू u32 के लिए Default साथ शुरू करने के लिए गड़बड़ कारण है कि 0 और नहीं 1? या 42? कोई अच्छा जवाब नहीं है, इसलिए वास्तव में कोई स्पष्ट डिफ़ॉल्ट नहीं है।

+0

मुझे केवल डिफ़ॉल्ट पर मिला क्योंकि ज़ीरो को मानक पुस्तकालय में बहिष्कृत के रूप में लेबल किया गया है। ~ शून्य गुण की अनुपस्थिति में, मैं तर्क दूंगा कि निश्चित आकार के सरणी किसी और चीज की तुलना में वेक्टर-वेक्टर अतिरिक्त में उपयोग होने की अधिक संभावना है, और शून्य वेक्टर इसके लिए पहचान वेक्टर है और डिफ़ॉल्ट रूप से एक और प्राकृतिक विकल्प है । लेकिन यह कुछ गंभीर बाइकहेडिंग है जो हम यहां कर रहे हैं :) –

3

मुझे डर है कि यदि आप ऐसा नहीं कर सकते हैं, तो आप अपने खुद के लिए संरचना Default को लागू करने की आवश्यकता होगी कर रहा हूँ:

struct Histogram { 
    sum: u32, 
    bins: [u32, ..256], 
} 

impl Default for Histogram { 
    #[inline] 
    fn default() -> Histogram { 
     Histogram { sum: 0, bins: [0, ..256] } 
    } 
} 

संख्यात्मक प्रकार इस मामले से कोई संबंध नहीं है, इसे और अधिक निश्चित के साथ समस्याओं की तरह है आकार सरणी। इस तरह की चीजों को मूल रूप से समर्थन देने के लिए उन्हें अभी भी सामान्य संख्यात्मक अक्षर की आवश्यकता है।

+0

धन्यवाद व्लादिमीर! Matthieu एक ही जवाब तेजी से दिया, लेकिन आपके इनलाइन है। अगर मैं कर सकता तो मैं दोनों स्वीकार करूँगा! –

+0

हाँ, मैंने बस उस समय सबमिट बटन दबाया जब दूसरा जवाब दिखाई दिया :) यह ठीक है, सब ठीक है :) –

1

दरअसल, लेखन के समय पर, निश्चित लंबाई सरणियों के लिए समर्थन अभी भी बाहर मानक पुस्तकालय में टुकड़ों में बांटा जा रहा है:

https://github.com/rust-lang/rust/issues/7622

2

आप शून्य के साथ हर क्षेत्र प्रारंभ करने में आश्वस्त हैं कि इस, काम करेगा:

impl Default for Histogram { 
    fn default() -> Histogram { unsafe { std::mem::zeroed() } } 
} 
संबंधित मुद्दे