2017-12-11 115 views
7

मैं की जंग बुक दूसरे संस्करण पढ़ रहा हूँ और मैं iterators अनुभाग में निम्न नमूना पाया:संकलक शिकायत क्यों नहीं करता है कि एक लेटर लूप के लिए स्थानांतरित हो गया है अपरिवर्तनीय है?

let v1 = vec![1, 2, 3]; 
let v1_iter = v1.iter();  
for val in v1_iter { 
    println!("Got: {}", val); 
} 

संकलक क्यों शिकायत नहीं है कि v1_iter अपरिवर्तनीय है? पुस्तक में कहा गया है कि लूप ने v1_iter का स्वामित्व लिया और इसे दृश्यों के पीछे उत्परिवर्तित बना दिया, लेकिन क्या आप एक अपरिवर्तनीय परिवर्तनीय को परिवर्तनीय रूप से परिवर्तित कर सकते हैं?

उत्तर

9

किताब में लिखा पाश के लिए v1_iter के स्वामित्व लिया और पर्दे के पीछे परिवर्तनशील बनाया,

वास्तव में, और एक एक भी सरल उदाहरण बना सकते हैं:

let v = vec![1,2,3]; 
let mut x = v; 
x.push(0); 

ध्यान दें कि v और x अलग परिवर्तनीय बाइंडिंग हैं: जब तक वेरिएबल v हमारे 3-तत्व वेक्टर को बनाए रखते हैं, तो चर का अनुबंध यह था कि वेक्टर को उत्परिवर्तित नहीं किया जाएगा। हालांकि, वेक्टर x पर ले जाया गया था, जो घोषणा करता है कि उत्परिवर्तन स्वीकार्य है। एक ही समारोह कॉल करने के लिए लागू होता है:

fn foo(mut x: Vec<i32>) { 
    x.push(0); 
} 

let v = vec![1,2,3]; 
foo(v); 

यह सुरक्षित है, क्योंकि चर का केवल एक ही अपने जीवनकाल के किसी भी बिंदु पर वेक्टर का मालिक है। एक बार v को x पर ले जाया गया, v अब और उपयोग नहीं किया जा सकता है। इसी तरह, आपके कोड में, v1_iter का उपयोग लूप के बाद अब नहीं किया जा सकता है।

लेकिन क्या आप एक अपरिवर्तनीय परिवर्तनीय को परिवर्तनीय रूपांतरित कर सकते हैं?

दोनों स्निपेट काम करते हैं क्योंकि मान mut के रूप में घोषित एक नए चर में स्थानांतरित किया गया था। हालांकि, एक बार एक चर को अपरिवर्तनीय (या परिवर्तनीय) के रूप में घोषित किया जाता है, तो वह चर अपने पूरे जीवनकाल के लिए रहता है, और इसे बदला नहीं जा सकता है। तो जवाब नहीं है, लेकिन स्वामित्व अर्थशास्त्र विभिन्न परिवर्तनशीलता गारंटी के साथ चरों में चलती मानों को सक्षम बनाता है।

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

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