2014-05-03 4 views
12

मैं अभी भी जंग सीखने में बच्चे के कदम उठा रहा हूं, और निम्नलिखित पर हैरान था।मुझे इस उदाहरण में "उधार मूल्य कितना लंबा नहीं रहता" क्यों मिलता है?

मैं नहीं समझ सकता है क्यों इस कोड को संकलित करता है:

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(); 
          ^~~~~~~~~~~~~~~~~~~ 

मुझे यकीन है कि इसमें जंग के स्कोप्स आदि के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है कि मैं समझता हूं कि कैसे विधि कॉल को एक अलग पंक्ति में ले जाने से कोई फर्क पड़ता है।

उत्तर

10

जंग को इतना नहीं पता कि बस अनुमान लगाया जा रहा है।

लगता है जैसे let range = [1,2,3,4,5,6,7,8,9].iter(); कथन के अंत में सरणी नष्ट हो जाती है क्योंकि वेक्टर धारण करने वाले कोई चर नहीं है। और इसलिए आप कहीं भी इशारा करते हुए इटरेटर को लटकते हैं।

सी ++ में समान है, जहां ऑब्जेक्टर को उस ऑब्जेक्ट पर बनाना संभव है जो बाद में हटा दिया जाता है।

+5

यह सही है: 'iter() 'में मूल टुकड़ा का संदर्भ होता है, और उस कथन में इसे तुरंत हटा दिया जाता है क्योंकि यह कहीं भी संग्रहीत नहीं होता है। संकलक तब आपको अपरिभाषित लेकिन लगभग निश्चित रूप से खराब व्यवहार से बचाता है जो निःशुल्क उपयोग के बाद होता है। –

+1

यहां डिज़ाइन स्पेस की अधिक चर्चा के लिए इस ब्लॉग पोस्ट को भी देखें: http://www.smallcultfollowing.com/babysteps/blog/2014/01/09/rvalue-lifetimes-in-rust/ (उत्तर से माइग्रेट करना मैंने पोस्ट किया था) – pnkfelix

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