2016-03-31 28 views
10

में एम्परसैंड 'और' और स्टार '*' प्रतीकों का अर्थ दस्तावेज को अच्छी तरह से पढ़ने के बावजूद, मैं & और * जंग के प्रतीक के बारे में उलझन में हूं, और आमतौर पर जंग के संदर्भ के बारे में क्या अधिक है ठीक ठीक। , निम्नलिखित कोड ठीक उसी काम करता हैजंग

fn main() { 
    let c: i32 = 5; 
    let rc = &c; 
    let next = rc + 1; 
    println!("{}", next); // 6 
} 

हालांकि:

इस उदाहरण में, यह एक सी ++ संदर्भ के समान (अर्थात, एक पते से, जो इस्तेमाल किया dereferenced है) हो रहा है

fn main() { 
    let c: i32 = 5; 
    let rc = &c; 
    let next = *rc + 1; 
    println!("{}", next); // 6 
} 

* का उपयोग संदर्भ को संदर्भित करने के लिए C++ में सही नहीं होगा। तो मैं समझना चाहता हूं कि यह जंग में क्यों सही है।

मेरे समझ अब तक, यह है कि, एक जंग संदर्भ यह dereferences के सामने * डालने, लेकिन * परोक्ष वैसे भी डाला जाता है ताकि आप इसे (जोड़ने की जरूरत नहीं है, जबकि सी ++ में, यह परोक्ष डाला जाता है, और यदि आप इसे सम्मिलित करें आपको संकलन त्रुटि मिलती है)।

हालांकि, कुछ इस तरह संकलित करता है नहीं:

fn main() { 
    let mut c: i32 = 5; 
    let mut next: i32 = 0; 
    { 
     let rc = &mut c; 
     next = rc + 1; 
    } 
    println!("{}", next); 
} 
<anon>:6:16: 6:18 error: binary operation `+` cannot be applied to type `&mut i32` [E0369] 
<anon>:6   next = rc + 1; 
         ^~ 
<anon>:6:16: 6:18 help: see the detailed explanation for E0369 
<anon>:6:16: 6:18 note: an implementation of `std::ops::Add` might be missing for `&mut i32` 
<anon>:6   next = rc + 1; 

लेकिन यह काम करता है:

fn main() { 
    let mut c: i32 = 5; 
    let mut next: i32 = 0; 
    { 
     let rc = &mut c; 
     next = *rc + 1; 
    } 
    println!("{}", next); // 6 
} 

ऐसा लगता है कि निहित dereferencing (एक ला सी ++) अपरिवर्तनीय संदर्भ के लिए सही है , लेकिन परिवर्तनीय संदर्भों के लिए नहीं। ऐसा क्यों है?

उत्तर

12

* किसी संदर्भ को संदर्भित करने के लिए * C++ में सही नहीं होगा। तो मैं समझना चाहता हूं कि यह जंग में क्यों सही है।

सी ++ में एक संदर्भ जंग में संदर्भ के समान नहीं है। जंग के संदर्भ सी ++ के पॉइंटर्स के करीब (उपयोग में, अर्थशास्त्र में नहीं) बहुत करीब हैं। स्मृति प्रतिनिधित्व के संबंध में, जंग के संदर्भ अक्सर एक ही सूचक होते हैं, जबकि सी ++ के संदर्भ एक ही वस्तु के वैकल्पिक नाम होते हैं (और इस प्रकार कोई स्मृति प्रतिनिधित्व नहीं होता है)।

सी ++ पॉइंटर्स और जंग संदर्भों के बीच का अंतर यह है कि जंग का संदर्भ कभी भी NULL नहीं होता है, कभी शुरू नहीं होता है और कभी भी लटकता नहीं होता है।


Add विशेषता (doc पृष्ठ के नीचे देखें) लागू किया गया है निम्नलिखित जोड़े और अन्य सभी संख्यात्मक पुरातन के लिए:

  • &i32 + i32
  • i32 + &i32
  • &i32 + &i32

यह सिर्फ एक सुविधा है जो std-lib डेवलपर्स लागू किया गया है। संकलक यह पता लगा सकता है कि &mut i32 का उपयोग किया जा सकता है जहां &i32 का उपयोग किया जा सकता है, लेकिन यह काम नहीं करता है (अभी तक?) जेनरिक के लिए है, तो एसटीडी-लिब डेवलपर्स भी निम्न संयोजन के लिए Add लक्षण (और सभी पुरातन के लिए उन) को लागू करने की आवश्यकता होगी:

  • &mut i32 + i32
  • i32 + &mut i32
  • &mut i32 + &mut i32
  • &mut i32 + &i32
  • &i32 + &mut i32

जैसा कि आप देख सकते हैं कि काफी हाथ से बाहर हो सकता है। मुझे यकीन है कि भविष्य में दूर चलेगा। तब तक, ध्यान दें कि &mut i32 के साथ समाप्त होने और गणितीय अभिव्यक्ति में इसका उपयोग करने की कोशिश करना दुर्लभ है।

+1

धन्यवाद, अब मैं समझता हूं। असल में, मैंने सोचा था कि यह ऐसा कुछ हो सकता है लेकिन मैंने विचार को खारिज कर दिया था, सोच रहा था कि एक पूर्णांक के योग को उस पूर्णांक के पते के साथ परिभाषित करना बहुत अजीब होगा। शायद इस दस्तावेज़ में जोर दिया जाना चाहिए कि जंग संदर्भों को पते के रूप में माना जाना चाहिए, और सी ++ संदर्भों से भ्रमित नहीं होना चाहिए। विस्तृत स्पष्टीकरण के लिए फिर से धन्यवाद। –

3
std::ops::Add के लिए

डॉक्स से:

impl<'a, 'b> Add<&'a i32> for &'b i32 
impl<'a> Add<&'a i32> for i32 
impl<'a> Add<i32> for &'a i32 
impl Add<i32> for i32 

ऐसा लगता है द्विआधारी + नंबर के लिए ऑपरेटर ऑपरेंड के साझा (लेकिन परिवर्तनशील नहीं) ऑपरेंड के संदर्भ और स्वामित्व संस्करणों के संयोजन के लिए लागू किया गया है। स्वचालित नियंत्रण के साथ इसका कोई लेना-देना नहीं है।