2017-01-07 11 views
5

Rust Reference का कहना है:इस रावल्यू को संदर्भ में उल्लिखित एक लाभा के लिए क्यों प्रचारित नहीं किया गया है?

एक काम या यौगिक-असाइनमेंट अभिव्यक्ति के बाईं संकार्य, एक lvalue संदर्भ है के रूप में एक एकल उधार के एकल संकार्य है।

[...]

जब एक rvalue एक lvalue संदर्भ में प्रयोग किया जाता है, एक अस्थायी संयुक्त राष्ट्र के नाम lvalue बनाया है और बजाय प्रयोग किया जाता है।

यह rvalue पदोन्नति स्पष्ट रूप से उधार लेने के साथ काम करता है:

let ref_to_i32 = &27; // a temporary i32 variable with value 27 is created 

लेकिन यह एक काम में काम करने के लिए (हालांकि संदर्भ के बारे में सभी lvalue संदर्भों, बस उधार नहीं बोलता) प्रतीत नहीं होता:

27 = 28; // error[E0070]: invalid left-hand side expression 

error description of E0070 इस राल्लू पदोन्नति का उल्लेख नहीं करता है। क्या यह संदर्भ में एक गलती है या वास्तव में असाइनमेंट या कंपाउंड असाइनमेंट एक्सप्रेशन के साथ रावल पदोन्नति को ट्रिगर करने का कोई तरीका है?

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

let ref x = 3; // works 

तो जाहिरा तौर पर, पदोन्नति केवल (compound-) असाइनमेंट के लिए काम नहीं करता है?

+1

पर्याप्त रूप से पर्याप्त, '* और mut 27 = 28; संकलित करता है। आपके उदाहरण में – mcarton

+0

@mcarton, पदोन्नति ऑपरेटर नहीं, उधारकर्ता ऑपरेटर के कारण प्रचार होता है। लेकिन दिलचस्प वास्तव में^_^ –

+1

संबंधित: प्रलेखन यह भी कहता है कि 'म्यूट ए = 1; * और म्यूट (ए) = 2; assert_eq! (ए, 1); 'पास होना चाहिए:' (ए) 'में 'ए'' और mut 'का संचालन नहीं है, इसलिए इसे एक रावल्यू में परिवर्तित किया जाना चाहिए। '(ए) 'फिर एक रावल्यू है, जो' और म्यूट 'का संचालन है, इसलिए इसे अस्थायी बनाया जाना चाहिए, और अस्थायी को' 2' असाइन किया जाना चाहिए। इसके बजाय, 'ए' को '2' असाइन किया गया है।(सरल कहने के लिए '(ए) = 2;' अस्वीकार किया जाना चाहिए, लेकिन मुझे लगता है कि कोड किसी भी तरह से संकलित करता है लेकिन रन-टाइम पर अलग-अलग व्यवहार होता है।) संकलक व्यवहार आपके कोड और खान के लिए समझ में आता है । – hvd

उत्तर

1

The reference इस प्रश्न को पोस्ट करने के समय से अद्यतन किया गया है। अब यह कहता है कि लेनदेन पदोन्नति के लिए रैल्यू असाइनमेंट के दौरान नहीं होता है, इसलिए यह पुराने संदर्भ में स्पष्ट रूप से एक त्रुटि थी।

Borrow operators:

& या & mut ऑपरेटरों एक rvalue करने के लिए लागू कर रहे हैं, एक अस्थायी मूल्य

यह शायद के रूप में अच्छी ref बाइंडिंग को लागू करने के लिए है, बनाई गई है, हालांकि मैं इसे स्पष्ट रूप से उल्लेख नहीं किया गया है।

Assignment:

बाएं हाथ संकार्य एक lvalue होना चाहिए: बल्कि एक अस्थायी करने के लिए इसे बढ़ावा देने की तुलना में, एक संकलक त्रुटि में एक rvalue परिणाम मिलते हैं।

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

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