2016-06-17 7 views
11

मैंने सीखा कि यदि एक चर को स्पष्ट रूप से का उपयोग करके उत्परिवर्तनीय घोषित नहीं किया गया है, तो यह अपरिवर्तनीय हो जाता है (इसे घोषणा के बाद बदला नहीं जा सकता है)। तो हमारे पास जंग में const कीवर्ड क्यों है? क्या वे समान नहीं हैं? यदि नहीं, तो वे अलग कैसे होते हैं?जंग में अपरिवर्तनीय और स्थिर चर के बीच क्या अंतर है?

उत्तर

11

const, जंग में, निरंतर के लिए कम है और संकलन समय मूल्यांकन से संबंधित है। यह दिखाता है:

  • जब घोषित स्थिरांक: const FOO: usize = 3;
  • जब घोषित संकलन समय मूल्यांकित कार्य: const fn foo() -> &'static str

मूल्यों के इन प्रकार के सामान्य पैरामीटर के रूप में इस्तेमाल किया जा सकता: [u8; FOO]। अभी के लिए यह सरणी आकार तक सीमित है, लेकिन भविष्य में इसे आगे बढ़ाने की बात, योजनाएं और आशा है।

इसके विपरीत, let बाध्यकारी एक रन-टाइम गणना मूल्य के बारे में है।

ध्यान दें कि mut के बावजूद उपयोग किया जा रहा है क्योंकि उत्परिवर्तन की अवधारणा अच्छी तरह से जानी जाती है, जंग वास्तव में यहां निहित है। &T और &mut T अलियासिंग के बारे में कर रहे हैं, नहीं अस्थिरता:

  • &T: साझा संदर्भ
  • &mut T: अनन्य संदर्भ

सबसे विशेष रूप से, कुछ प्रकार के आंतरिक अस्थिरता की सुविधा है और &T के माध्यम से उत्परिवर्तित जा सकता है (साझा संदर्भ): Cell, RefCell, Mutex, आदि


नोट: वहाँ mut और const कच्चे संकेत (*mut T और *const T) जो यहाँ पर चर्चा नहीं कर रहा है के साथ का एक वैकल्पिक इस्तेमाल होता है।

1

const संकलन-समय स्थिरांक के लिए जो कुछ भी शामिल है, के साथ है। उदाहरण के लिए, आप एक निश्चित आकार का सरणी बना सकते हैं जिसका आकार const है, लेकिन आप let बाध्यकारी के साथ ऐसा नहीं कर सकते हैं। बेशक, इसका यह भी अर्थ है कि आप की तुलना में let बाध्यकारी में दूर, कहीं और चीजें डाल सकते हैं।

8

const चर के लिए नहीं है; यह निरंतर मानों के लिए है जो कहीं भी संग्रहीत नहीं किए जा सकते हैं; वे एक शाब्दिक मूल्य के लिए प्रभावी रूप से एक उपनाम हैं।

गैर mutlet वाणी एक वास्तविक चर जो रनटाइम पर बनाई गई है, ले जाया जा सकता है (और नहीं पहुँच), और यहां तक ​​कि आंतरिक अस्थिरता है कुछ मामलों में (अगर यह Cell सदस्यों, उदाहरण के लिए शामिल हैं)।

0

स्थिरांक नए सिरे से परिभाषित नहीं किया जा सकता:

let x = 10u32; 
const Y:u32 = 20u32; 

let x = 11u32; 
//error: duplicate definition of value `Y` [E0428] 
//const Y:u32 = 21u32; 

println!("x={} Y={}",x,Y); //x=11 Y=20 
संबंधित मुद्दे