2015-10-27 11 views
5

के आधार पर किसी वेक्टर में कुछ दबाकर मैं एक वेक्टर का अंतिम तत्व प्राप्त करना चाहता हूं और इसे धक्का देने के लिए अगले तत्व को निर्धारित करने के लिए इसका उपयोग करना चाहता हूं। यहां एक उदाहरण है कि यह कैसे काम नहीं करता है, लेकिन यह दिखाता है कि क्या मैं प्राप्त करने के लिए प्रयास करें:अपने अंतिम तत्व

let mut vector: Vec<i32> = Vec::new(); 

match vector.last() { 
    Some(last_value) => vector.push(*last_value + 1), 
    None =>(), 
} 

समस्या यह है कि मैं धक्का उपयोग नहीं कर सकते, जबकि वेक्टर भी अपरिवर्तनीय उधार लिया जाता है है। ऐसा करने का एक अच्छा तरीका क्या होगा?

उत्तर

7

vector.last() का परिणाम Option<&i32> है। उस मूल्य में संदर्भ वेक्टर उधार लेता रहता है। इससे पहले कि हम इसे धक्का दे सकें, हमें वेक्टर में सभी संदर्भों से छुटकारा पाना होगा।

यदि आपके वेक्टर में Copy सक्षम मान हैं, तो वेक्टर के मूल्य को तुरंत उधार समाप्त करने के लिए प्रतिलिपि बनाएँ।

fn main() { 
    let mut vector: Vec<i32> = Vec::new(); 

    match vector.last() { 
     Some(&last_value) => vector.push(last_value + 1), 
     None =>(), 
    } 
} 

यहाँ, मैं पैटर्न Some(last_value) के बजाय Some(&last_value) का उपयोग किया है। यह विनाश संदर्भ और एक प्रतिलिपि को मजबूर करता है।

<anon>:5:14: 5:25 error: cannot move out of borrowed content 
<anon>:5   Some(&last_value) => vector.push(last_value + "abc"), 
         ^~~~~~~~~~~ 

अपने वेक्टर Copy सक्षम प्रकार शामिल नहीं है, तो आपको पहले मूल्य क्लोन करने के लिए चाहते हो सकता है, तो::

आप एक प्रकार है कि सक्षम नहीं Copy है के साथ इस पद्धति की कोशिश, तो आप एक संकलक त्रुटि मिलेगी
fn main() { 
    let mut vector: Vec<String> = Vec::new(); 

    match vector.last().map(|v| v.clone()) { 
     Some(last_value) => vector.push(last_value + "abc"), 
     None =>(), 
    } 
} 

या आप मूल्य को दूसरे तरीके से बदल सकते हैं जैसे कि .map() कॉल वेक्टर से उधार नहीं लेता है।

fn main() { 
    let mut vector: Vec<String> = Vec::new(); 

    // Push a string containing the length of the last element. 
    match vector.last().map(|v| v.len().to_string()) { 
     Some(new_value) => vector.push(new_value), 
     None =>(), 
    } 
} 
+0

क्या आप ओपी के कोड की तुलना में अपना पहला उदाहरण समझा सकते हैं? यह कितना अलग है और कॉपी यहां कहां आती है? –

+1

@JimmyCuadra ओपी के कोड में 'last_value()' 'last_value' के विरुद्ध मेल खाता है। चूंकि 'last_value()' एक संदर्भ देता है, 'last_value' भी एक संदर्भ बन जाता है। हालांकि, फ्रांसिस ने पैटर्न को 'और last_value' में बदल दिया, इसलिए संदर्भ' & 'से मेल खाता है, और मान स्वयं 'last_value' से मेल खाता है और इसलिए मूल्य द्वारा प्रतिलिपि बनाई जाती है। इसे विनाशकारी कहा जाता है। – Malcolm

+2

शायद एक 'अगर चलो' 'मैच' से बेहतर हो जाएगा? – Shepmaster

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