2013-12-09 7 views
5

मैं निम्नलिखित है उधार लिया जाता है (पर्याप्त निर्दोष) जंग कोड:अपरिवर्तनीय रूप foo उधार नहीं कर सकते, क्योंकि यह भी रूप में परिवर्तनशील

let file = &Path(some_file_name); 
let mut buf = [0u8, ..12]; 
match io::file_reader(file) { 
    Ok(reader) => reader.read(buf, buf.len()), 
    Err(msg) => println(msg) 
} 

rustc शिकायत है कि

उधार नहीं कर सकते buf[] के रूप में अपरिवर्तनीय है क्योंकि यह है उत्परिवर्तनीय

यदि संबंधित रेखा को

के रूप में उधार लिया गया है
Ok(reader) => reader.read(buf, 12), 

सभी ठीक काम करेंगे। लेकिन यह कम संतोषजनक है क्योंकि अब बफर की लंबाई कोड में डुप्लिकेट की गई है। हालांकि rustc शिकायत करते हुए अस्पष्ट रूप से समझते हैं, मैं अभी भी यह तर्क देना चाहता हूं कि rustc यह अनुमान लगाने में सक्षम होना चाहिए कि len() एक शुद्ध कार्य है और इसका कोई दुष्प्रभाव नहीं है इसलिए कोड मान्य है। इसके अलावा, यह एक बफर में पढ़ने के लिए एक आम आम पैटन है।

तो यहां बेवकूफ जंग का रास्ता क्या है?

EDIT: कोड जंग 0.8 के लिए था। जैसा कि @pnkfelix ने इंगित किया है, तब से Reader.read एपीआई बदल दी गई है। इसे अब दूसरे पैरामीटर की आवश्यकता नहीं है।

+0

अपना पूरा कोड प्रदान करने के लिए देखभाल? मैंने आपके कोड के आधार पर कुछ इकट्ठा किया लेकिन मुझे एक अलग त्रुटि मिली। आप जंग का किस संस्करण का उपयोग कर रहे हैं? – asm

+0

बीटीडब्ल्यू, 'पथ' 'पथ' के लिए एक बॉक्स आवंटित कर रहा है, जब कोई पथ सीधे स्टैक पर रख सकता है और इसके लिए सामान्य संदर्भ ले सकता है, उदा। 'और Path'। – huon

+0

एंड्रयू, कोड जंग 0.8 के लिए था। dbaupp, हां वास्तव में। 'और पथ 'बेहतर होगा। – edwardw

उत्तर

7

इस उत्तर rustc की मेरी संस्करण के लिए है: rustc 0.9-पूर्व (61443dc 2013-12-01)

  1. रीडर विशेषता के वर्तमान संस्करण एक आप सूचीबद्ध तुलना में एक अलग इंटरफ़ेस है। एक आउटपुट बफर और लंबाई दोनों (एक टुकड़ा) लेने के बजाय, अब यह आउटपुट बफर लेता है (एक टुकड़ा)। यह टुकड़ा से आउटपुट बफर की लंबाई प्राप्त कर सकता है, इसलिए आपको खुद को दोहराने की आवश्यकता नहीं है।

  2. कारण जंग की शिकायत यह है कि यह सुनिश्चित करने की कोशिश कर रहा है कि आपने स्मृति के अलियासिंग को पढ़ना/लिखना नहीं है। यह आपको एक संदर्भ में buf के एक अपरिवर्तनीय उधार को पार करने और buf के एक उत्परिवर्तनीय उधार को किसी अन्य संदर्भ में रोकने से रोकने का प्रयास कर रहा है।

    • जब आप कहते हैं कि len() एक शुद्ध समारोह है, मैं इसे ले क्या आपका मतलब है कि यह किसी भी परिवर्तनशील राज्य में नहीं लिखा है। हालांकि, सामान्य मामले में, यह उत्परिवर्तनीय स्थिति पढ़ सकता है। (यह मामला यहां नहीं है, क्योंकि हम एक निश्चित आकार बफर से निपट रहे हैं। लेकिन फिर भी, सामान्य रूप से कोई कल्पना कर सकता है कि हम कुछ ऑटो-रीसाइजिंग सरणी अबास्ट्रक्शन से निपट रहे हैं।)

    • तो एक प्रभाव है, सिर्फ एक जो लोग अक्सर इसके बारे में नहीं सोचते: पढ़ने की है।

    • मुझे आपके द्वारा देखी गई समस्या से निपटने का बेवकूफ तरीका संदेह है (इस तथ्य को अनदेखा कर रहा है कि एपीआई बदल गया है) buf के ओवरलैपिंग बोरो से बचने के लिए होगा, उदा।इसलिए जैसे:

      Ok(reader) => { let l = buf.len(); reader.read(buf, l) },

इस तरह, आप अपने आप को दोहराने नहीं है, आप केवल दो गैर-अतिव्यापी विस्तार प्रदान कर रहे हैं जहां buf विभिन्न तरीकों से उधार लिया जाता है।

+0

यह सही समझ में आता है। धन्यवाद, pnkfelix। – edwardw

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

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