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 =>(),
}
}
स्रोत
2015-10-27 03:32:38
क्या आप ओपी के कोड की तुलना में अपना पहला उदाहरण समझा सकते हैं? यह कितना अलग है और कॉपी यहां कहां आती है? –
@JimmyCuadra ओपी के कोड में 'last_value()' 'last_value' के विरुद्ध मेल खाता है। चूंकि 'last_value()' एक संदर्भ देता है, 'last_value' भी एक संदर्भ बन जाता है। हालांकि, फ्रांसिस ने पैटर्न को 'और last_value' में बदल दिया, इसलिए संदर्भ' & 'से मेल खाता है, और मान स्वयं 'last_value' से मेल खाता है और इसलिए मूल्य द्वारा प्रतिलिपि बनाई जाती है। इसे विनाशकारी कहा जाता है। – Malcolm
शायद एक 'अगर चलो' 'मैच' से बेहतर हो जाएगा? – Shepmaster