मैं अभी भी जंग सीखने में बच्चे के कदम उठा रहा हूं, और निम्नलिखित पर हैरान था।मुझे इस उदाहरण में "उधार मूल्य कितना लंबा नहीं रहता" क्यों मिलता है?
मैं नहीं समझ सकता है क्यों इस कोड को संकलित करता है:
use std::iter::AdditiveIterator;
fn main() {
let range = [1,2,3,4,5,6,7,8,9];
let sum = range.iter().map(|&x| x * x).filter(|&x| x % 2 == 0).sum();
println!("{}", sum);
}
हालांकि यह नहीं करता है: (बस चलती .iter()
अप)
use std::iter::AdditiveIterator;
fn main() {
let range = [1,2,3,4,5,6,7,8,9].iter();
let sum = range.map(|&x| x * x).filter(|&x| x % 2 == 0).sum();
println!("{}", sum);
}
कौन इस त्रुटि renders:
test.rs:5:17: 5:36 error: borrowed value does not live long enough
test.rs:5 let range = [1,2,3,4,5,6,7,8,9].iter();
^~~~~~~~~~~~~~~~~~~
मुझे यकीन है कि इसमें जंग के स्कोप्स आदि के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है कि मैं समझता हूं कि कैसे विधि कॉल को एक अलग पंक्ति में ले जाने से कोई फर्क पड़ता है।
यह सही है: 'iter() 'में मूल टुकड़ा का संदर्भ होता है, और उस कथन में इसे तुरंत हटा दिया जाता है क्योंकि यह कहीं भी संग्रहीत नहीं होता है। संकलक तब आपको अपरिभाषित लेकिन लगभग निश्चित रूप से खराब व्यवहार से बचाता है जो निःशुल्क उपयोग के बाद होता है। –
यहां डिज़ाइन स्पेस की अधिक चर्चा के लिए इस ब्लॉग पोस्ट को भी देखें: http://www.smallcultfollowing.com/babysteps/blog/2014/01/09/rvalue-lifetimes-in-rust/ (उत्तर से माइग्रेट करना मैंने पोस्ट किया था) – pnkfelix