2015-10-18 34 views
12

मैं समझता हूं कि कैसे & काम करता है, लेकिन उस और ref के बीच क्या अंतर है? क्या वे अदलाबदल योग्य हैं?`&` और `ref` के बीच क्या अंतर है?

मुझे मिली एकमात्र जानकारी (क्योंकि Google पर प्रतीकों की खोज बहुत अच्छी तरह से काम नहीं करती है) this page on Rust By Example है, लेकिन यह दोनों के बीच अंतर की व्याख्या नहीं करता है। The Book बहुत जानकारीपूर्ण नहीं है, और ref केवल Patterns अध्याय पर सूचीबद्ध है। लेकिन ऐसा लगता है कि उस संदर्भ के बाहर ref भी उपयोग किया जाता है।

तो, ref के उपयोग क्या हैं, और & में क्या अंतर है?

+0

* बहुत * संबंधित है, लेकिन नहीं वास्तव में एक नकली है, यह 'ref' और' और 'जो comparsion नहीं है के बाद से: http://stackoverflow.com/questions/27911656/rust-by-example-the-ref- पैटर्न – Kroltan

उत्तर

12

ref पैटर्न में प्रयोग किया जाता है एक lvalue के लिए एक संदर्भ बाध्य करने के लिए (एक lvalue एक मूल्य है आप, का पता ले जा सकते हैं और अधिक या कम)।

यह समझना महत्वपूर्ण है कि पैटर्न सामान्य अभिव्यक्तियों से "पीछे की ओर" जाते हैं, क्योंकि इन्हें deconstruct मानों के लिए उपयोग किया जाता है।

यहां एक साधारण उदाहरण है। मान लीजिए कि हमें इस है:

let value = 42; 

हम दो तरीकों से value के लिए एक संदर्भ के लिए बाध्य कर सकते हैं:

let reference1 = &value; 
let ref reference2 = value; 

पहले मामले में, हम value का पता लेने के लिए एक ऑपरेटर के रूप में & का उपयोग करें। दूसरे मामले में, हम एक lvalue "deconstruct" करने के लिए ref पैटर्न का उपयोग करें। दोनों स्थितियों में, चर का प्रकार &i32 है।

& पैटर्न में भी उपयोग किया जा सकता है, लेकिन यह विपरीत है: यह इसे संदर्भित करके संदर्भ का निर्धारण करता है। मान लीजिए हमने:

let value = 42; 
let reference = &value; 

हम कर सकते हैं दो में भिन्नता reference तरीके:

let deref1 = *reference; 
let &deref2 = reference; 

यहाँ, दोनों deref1 और deref2i32 है प्रकार।

हालांकि, यहां दिखाए गए दो तरीकों से एक ही अभिव्यक्ति को लिखना हमेशा संभव नहीं होता है। उदाहरण के लिए, आप enum संस्करण में संग्रहीत मान का संदर्भ लेने के लिए & का उपयोग नहीं कर सकते हैं: आपको उस पर मिलान करने की आवश्यकता है।

match option { 
    Some(ref value) => { /* stuff */ } 
    None => { /* stuff */ } 
} 

वहाँ जंग में कोई रास्ता नहीं आप अन्यथा मूल्य का उपयोग करने की & ऑपरेटर का उपयोग कर सकते है के बाद से: उदाहरण के लिए, यदि आप एक Some में मूल्य के लिए एक संदर्भ लेना चाहते हैं, आप लिखते हैं की जरूरत है।

+0

धन्यवाद, इसलिए 'fn blah (ref a: i32) {} 'जैसी परिभाषाएं' fn blah (a: और i32)' के समतुल्य हैं, जब वे दोनों व्यक्त की जा सकती हैं? – Kroltan

+4

@ क्रोलटन नहीं, वे बराबर नहीं हैं। एक पैटर्न है (यानी की 'बाईं ओर कुछ भी:') एक समारोह तर्क में विशुद्ध रूप से एक कार्यान्वयन विस्तार है, कॉल केवल (के 'सही करने के लिए अर्थात बातें:') प्रकार देखते हैं।पहला मामला 'एफएन ब्लाह के बराबर है (tmp: i32) {ref = a tmp; ...} '। पहले को 'ब्लाह (0)' कहा जाता है जबकि दूसरा को 'ब्लाह (और 1)' कहा जाता है। बेशक, फ़ंक्शन स्वयं, दोनों मामलों में 'ए' का प्रकार' और i32' है, यह केवल बाहरी इंटरफ़ेस है जो अलग है। – huon

+0

@ huon-dbaupp, क्या इसका मतलब यह है कि रेफरी संस्करण पहले मूल्य को प्रतिलिपि/स्थानांतरित करेगा? – Kroltan

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