2016-10-28 7 views
5

संरचना में कच्चे बिंदुओं का उपयोग करते समय, जंग को डिफ़ॉल्ट से प्राप्त करने की अनुमति नहीं है।कच्चे सूचक के लिए 'डिफ़ॉल्ट' को कैसे कार्यान्वित करें?

जैसे:

#[derive(Default)] 
struct Foo { 
    bar: *mut Foo, 
    baz: usize, 
} 

रिपोर्ट

error[E0277]: the trait bound `*mut Foo: std::default::Default` is not satisfied 

मैं इस कोशिश की, लेकिन यह काम नहीं करता:

impl doesn't use types inside crate 
:

impl Default for *mut Foo { 
    fn default() -> *mut Foo { 
     ptr::null_mut() 
    } 
} 

यह एक त्रुटि देता है

कच्चे सूचक के लिए Default घोषित करने का कोई तरीका है?

अन्यथा मुझे किसी भी struct के लिए स्पष्ट default फ़ंक्शंस लिखना होगा जिसमें कच्चे सूचक शामिल हैं, इस उदाहरण में ठीक है, लेकिन बड़े structs के लिए यह कठिन हो सकता है, इसलिए मैं इसे कुछ से बचने में सक्षम होना चाहता हूं मामलों।

+3

अब मैं सोच रहा हूँ, अगर किसी को सक्रिय रूप से फैसला किया है कि कच्चे संकेत Impl नहीं करना चाहिए 'Default' या यदि impl बस भूल गया था ... –

+0

मैं एक मुद्दा बना: https://github.com/जंग-लैंग/जंग/मुद्दों/43,722 – AndreyT

उत्तर

6

Is there a way to declare Default for the raw pointer?

नहीं, वर्तमान में वहाँ नहीं है। या तो विशेषता या प्रकार को क्रेट में परिभाषित करने की आवश्यकता है, जिसमें विशेषता-इम्प्ला लिखा जाता है (जिसे "अनाथ नियम" कहा जाता है)।

हालांकि, आपको पॉइंटर वाले सभी प्रकार के लिए Default मैन्युअल रूप से कार्यान्वित करने की आवश्यकता नहीं है। आप एक नया प्रकार बना सकते हैं, जो एक कच्चे सूचक को लपेटता है और Default लागू करता है। फिर आप अपने सभी structs में इस नए प्रकार का उपयोग कर सकते हैं और बस Default प्राप्त कर सकते हैं।

struct ZeroedMutPtr<T>(pub *mut T); 

impl<T> Default for ZeroedMutPtr<T> { ... } 
संबंधित मुद्दे