2017-03-24 14 views
8

मेरे पास निम्न जंग प्रोग्राम है और मुझे उम्मीद है कि x के बाद से इसे संकलन त्रुटि में परिणाम दिया जाएगा। लेकिन यह अनुपालन करता है और आउटपुट देता है। क्यूं कर?यह जंग प्रोग्राम अपरिवर्तनीयता को अनदेखा क्यों करता है

fn main() { 
    let (x, y) = (1, 3); 
    println!("X is {} and Y is {}", x, y); 

    let x: i32 = 565; 
    println!("Now X is {}", x); 
} 

उत्तर

13

जंग वास्तव में आप एक ब्लॉक में अन्य चर शैडो, तो let x: i32 = 565; एक नई चर x कि xlet (x,y) = (1,3); साथ पहले परिभाषित छाया को परिभाषित करने में बताती है। ध्यान दें कि आप x को फिर से परिभाषित कर सकते हैं ताकि दूसरे x एक नया प्रकार हो सकें!

fn main(){ 
    let x = 1; 
    println!("Now X is {}",x); 

    let x = "hi"; 
    println!("Now X is {}",x); 
} 

यह reddit thread के बारे में यह क्यों उपयोगी है और अधिक विस्तार में चला जाता है। दो चीजें हैं जो उल्लेख कर रहे हैं कि दिलचस्प लग रहे हैं:

  • संचालन जो चर का स्वामित्व लेने के लिए, लेकिन एक ही प्रकार के अन्य चर वापसी के लिए, यह कभी कभी लौटे चर को फिर से परिभाषित करने के लिए "अच्छा लग रहा है" एक ही नाम। here से:

    let iter = vec.into_iter(); 
    let iter = modify(iter); 
    let iter = double(iter); 
    
  • या एक चर अपरिवर्तनीय बनाने के लिए:

    let mut x; 
    // Code where `x` is mutable 
    let x = x; 
    // Code where `x` is immutable 
    
+1

क्यों इस भाषा में अनुमति दी है? क्या इस कारण तर्क कार्यक्रम त्रुटियों को बड़े कार्यक्रम में समझना आसान नहीं है? छायांकन का उद्देश्य क्या है और क्या कोई अन्य भाषा है जो इन अवधारणाओं का उपयोग करती है? – Viraj

+0

आप पहले से छायांकित चर का संदर्भ कैसे दे सकते हैं? – Dai

+3

@ दाई मुझे नहीं लगता कि आप कर सकते हैं ... आप हमेशा किसी अन्य चर के लिए स्वामित्व पास कर सकते हैं 'let y = x'। – Alec

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