2015-05-29 3 views
7
let mut result = String::with_capacity(1000); 

result.push_str("things... "); 
result.push_str("stuff... "); 

result.truncate((result.len() - 4)); 

हालांकि, यह एक संकलित त्रुटि है। उधार चेकर और संभवतः उत्परिवर्तन के साथ कुछ करना है।अपरिवर्तनीय के रूप में उधार नहीं ले सकता है - स्ट्रिंग और लेन()

let newlen = result.len() - 4; 
result.truncate(newlen); 

क्यों:

error[E0502]: cannot borrow `result` as immutable because it is also borrowed as mutable 
--> <anon>:7:22 
    | 
7 |  result.truncate((result.len() - 4)); 
    |  ------   ^^^^^^   - mutable borrow ends here 
    |  |    | 
    |  |    immutable borrow occurs here 
    |  mutable borrow occurs here 

फिर भी, अगर मैं इसे थोड़ा परिवर्तन मैं ऐसा करने की अनुमति है? क्या इसे बदलने का कोई तरीका है ताकि इसे एक पंक्ति में लिखा जा सके? (पीएस यह जंग 1.0 पर है)

उत्तर

9

यह जंग उधार जांच प्रक्रिया की दुर्भाग्यपूर्ण कमी है। यह अनिवार्य रूप से होता है क्योंकि

result.truncate(result.len() - 2) 

String::truncate(&mut result, result.len() - 2) 

के बराबर है और यहां आप देख सकते हैं कि क्योंकि बहस में बाएँ-से-सही क्रम, result वास्तव में mutably उधार लिया जाता है गणना से पहले यह result.len() में प्रयोग किया जाता है ।

मुझे जंग समस्या मुद्दे ट्रैकर में यह समस्या मिली: #6268। यह समस्या non-lexical borrows RFC issue के पक्ष में बंद कर दी गई थी। ऐसा लगता है कि यह उन चीजों में से एक है जो अच्छा होगा लेकिन 1.0 से पहले उपलब्ध होने के लिए और अधिक समय की आवश्यकता थी। This पोस्ट कुछ हितों का भी हो सकता है (भले ही यह लगभग दो साल पुराना हो)।

+0

इससे स्पष्ट करने में मदद मिलती है। यह किसी भी चीज़ से परेशान है। तो त्रुटि 'ट्रंकेट' की आवश्यकता के बीच एक संघर्ष से संबंधित है और 'लैन' अपरिवर्तनीयता की आवश्यकता है? ऐसा लगता है कि 'result.len()' का काम खत्म हो जाने से पहले पूरा हो जाएगा, जिसका अर्थ यह है कि यह किसी भी चीज से कंपाइलर क्विर्क से अधिक है? http://doc.rust-lang.org/std/string/struct.String.html#method.len – jocull

+0

आप लगभग सही हैं - समस्या यह है कि 'ट्रंकेट' के लिए 'और mut self' की आवश्यकता होती है जो * किसी भी * बाद में प्रतिबंधित होती है एक ही दायरे में उधार लेना। और हां, यह * लगता है कि 'result.len() 'को' truncate() 'को सौंपने से पहले पूरा हो गया है, हालांकि, मेरा जवाब बताता है कि ऐसा क्यों नहीं है - असल में, विधि रिसीवर की गणना की जाती है * पहले * तर्क, और इसलिए 'result.len()' द्वारा अपेक्षित * 'और परिणाम 'से पहले * और mut result' गुंजाइश में है। –

+0

@jocull, यदि आप इसमें रूचि रखते हैं तो आप मेरे अपडेट में जिन मुद्दों से जुड़े हैं, उनमें अधिक जानकारी मिल सकती है। –

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

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