2017-04-20 14 views
5

मैं जंग 1.13 स्थापित किया है और कोशिश की:कंपाइलर एक त्रुटि रिपोर्ट क्यों नहीं करता है जब एक चर परिवर्तनीय के रूप में घोषित नहीं किया गया है?

fn main() { 
    let x: u32; 
    x = 10; // no error? 
} 

जब मैं इस फाइल वहाँ कुछ चेतावनी है संकलित, लेकिन कोई त्रुटि है। जैसा कि मैं x को के रूप में घोषित नहीं कर रहा हूं, कोई त्रुटि नहीं होनी चाहिए?

+10

यह स्थगित प्रारंभिकता है, उत्परिवर्तन नहीं। – ildjarn

+2

जंग 1.16 जंग का वर्तमान संस्करण है, और 1.17 कुछ हफ्तों में जारी किया जाना चाहिए। वर्तमान रहने के लिए यह लायक है। – Shepmaster

उत्तर

12

आप क्या लिखा है के समान है:

let x: u32 = 10; 

संकलक यह उसके बाद उत्परिवर्तित देने की अनुमति नहीं होगी: यदि आप एक इस्तेमाल करने की कोशिश

let x: u32; 
x = 10; 
x = 0; // Error: re-assignment of immutable variable `x` 

ध्यान दें कि यह एक संकलक त्रुटि है अप्रारंभीकृत चर:

let x: u32; 
println!("{}", x); // Error: use of possibly uninitialized variable: `x` 

यह सुविधा बहुत उपयोगी है अगर आप INI करना चाहते हो सकता है रनटाइम स्थितियों के आधार पर परिवर्तनीय को अलग-अलग करें। एक अनुभवहीन उदाहरण:

let x: u32; 
if condition { 
    x = 1; 
} else if other_condition { 
    x = 10; 
} else { 
    x = 100; 
} 

लेकिन फिर भी यह अभी भी एक त्रुटि हो जाएगा अगर वहाँ एक संभावना कि यह प्रारंभ नहीं किया गया है:

let x: u32; 
if condition { 
    x = 1; 
} else if other_condition { 
    x = 10; 
} // no else 
println!("{:?}", x); // Error: use of possibly uninitialized variable: `x` 
+4

इडियेटोमैटिक जंग अधिक अभिव्यक्ति-उन्मुख वाक्यविन्यास का उपयोग करने की संभावना अधिक होगी: 'x = if condition {1} अन्य अगर अन्य_condition {10} else {100}; '। इन उदाहरणों में स्थगित प्रारंभिकरण की कोई आवश्यकता नहीं है। –

+1

@MaththieuM। यह सच है। लेकिन अगर कुछ सशर्त शाखाओं के अंदर विभिन्न दुष्प्रभाव थे, तो यह अजीब लगेगा। उस स्थिति में, मुझे लगता है कि यह फॉर्म अधिक मूर्खतापूर्ण होगा। –

8

के रूप में उल्लेख किया है, इस उत्परिवर्तन नहीं है, लेकिन टाल प्रारंभ:

  • उत्परिवर्तन एक मौजूदा चर का मान बदलने के बारे में है,
  • टाल initi एकीकरण एक बिंदु पर एक चर घोषित करने के बारे में है, और बाद में इसे शुरू करना।

जंग संकलक पटरियों एक चर, संकलन समय पर एक मूल्य है कि क्या इतनी सी के विपरीत वहाँ गलती से एक गैर-आरंभिकृत चर (एक चर से ले जाया गया था या C++,) का उपयोग करने का कोई खतरा नहीं है।


आस्थगित आरंभीकरण उपयोग करने के लिए सबसे महत्वपूर्ण कारण गुंजाइश है।

fn main() { 
    let x; 
    let mut v = vec!(); 

    { 
     x = 2; 
     v.push(&x); 
    } 

    println!("{:?}", v); 
} 

जंग में, उधार-चेकर को मान्य होगा कि एक संदर्भ मूल्य इसे करने के लिए संदर्भित करता है, झूलने संदर्भ को रोकने से अधिक जीवित नहीं कर सकते।

इसका मतलब यह है v.push(&x) की आवश्यकता है कि कि xv से अधिक समय रहता है, और इसलिएv से पहले घोषित किया।

इसकी आवश्यकता अक्सर फसल नहीं होती है, लेकिन जब अन्य समाधानों को रन-टाइम चेक की आवश्यकता होती है।

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

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