2017-02-16 10 views
7

इस कार्य के लिए कार्यान्वयन क्या है। निम्नलिखित चेक टाइप करेंगे:मुझे 'बॉक्स' से स्वामित्व वाला मूल्य कैसे प्राप्त होगा?</p> <pre><code>fn unbox<T>(value: Box<T>) -> T { // ??? } </code></pre> <p>प्रलेखन है कि मैं क्या चाहते हैं की तरह लग रहा में केवल समारोह <code>Box::into_raw</code> है:

fn unbox<T>(value: Box<T>) -> T { 
    *value.into_raw() 
} 

यह त्रुटि error[E0133]: dereference of raw pointer requires unsafe function or block देता है। इसे unsafe { ... } ब्लॉक में लपेटकर इसे ठीक करता है।

fn unbox<T>(value: Box<T>) -> T { 
    unsafe { *value.into_raw() } 
} 

क्या यह सही कार्यान्वयन है? यदि हां, तो यह असुरक्षित क्यों है? इसका क्या मतलब है?

शायद यह प्रश्न मेरी सामान्य अनिश्चितता दिखाता है कि कैसे Box वास्तव में काम करता है।

+1

नोट: आपके प्रस्तावित कार्यान्वयन में, आप 'बॉक्स' द्वारा आवंटित स्मृति को लीक कर रहे हैं। –

उत्तर

11

मूल्य भिन्नता:

fn unbox<T>(value: Box<T>) -> T { 
    *value 
} 

रास्ता वापस पूर्व 1.0 जंग में, ढेर-आवंटित मूल्यों बहुत ही खास प्रकार थे, और वे sigil ~ (~T के रूप में) का इस्तेमाल किया। जंग के लिए सड़क के साथ 1.0, इस विशेष-कासिंग को हटा दिया गया था ... लेकिन यह सब नहीं।

यह विशेष विशेषता "डेफ मूव" नाम से जाती है, और एक प्रथम श्रेणी की अवधारणा के रूप में इसका समर्थन करने के बारे में proto-RFC है। तब तक, जवाब है "क्योंकि Box विशेष है"।

+0

मैंने कोशिश क्यों नहीं की? 'डेफ' विशेषता एक 'और टी' वापस करने के लिए प्रतीत होता है। क्या मुझे समझ में नहीं आता कि '*' ऑपरेटर क्या करता है, या बक्से वास्तव में विशेष हैं? – Calebmer

+0

@Calebmer ['*' और 'deref'] के बीच एक अंतर है (http://stackoverflow.com/q/31624743/155423), ** और ** बॉक्स इस मामले में विशेष हैं। – Shepmaster

+1

मेरी इच्छा है कि इसके बजाय एक स्पष्ट विधि थी :( –

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