2010-06-06 19 views
5

किनारे के मामले का बिट, लेकिन कोई विचार क्यों & & = इस तरह से व्यवहार करेगा? मैं 1.9.2 का उपयोग कर रहा हूँ।रूबी और& = एज केस

obj = Object.new 
obj.instance_eval {@bar &&= @bar} # => nil, expected 
obj.instance_variables # => [], so obj has no @bar instance variable 

obj.instance_eval {@bar = @bar && @bar} # ostensibly the same as @bar &&= @bar 
obj.instance_variables # => [:@bar] # why would this version initialize @bar? 

तुलना के लिए, || = नहीं के बराबर करने के लिए उदाहरण चर initializes, के रूप में मैं उम्मीद थी:

obj = Object.new 
obj.instance_eval {@foo ||= @foo} 
obj.instance_variables # => [:@foo], where @foo is set to nil 

धन्यवाद!

+0

यह पोस्ट प्यारपूर्वक [सिंबलहाउंड] (http://www.symbolhound.com/) के साथ मिला! –

उत्तर

5

यह है, क्योंकि @bar गलत का आकलन, और इस तरह &&= आगे नहीं अभिव्यक्ति का मूल्यांकन होगा ... अपने दूसरे अभिव्यक्ति है, जो किसी भी मामले में @bar को प्रदान करती है, कोई बात नहीं क्या निम्नलिखित अभिव्यक्ति के निराकरण के विपरीत। यह ||= केस के साथ चला जाता है जो पूर्ण अभिव्यक्ति का मूल्यांकन करता है, इससे कोई फर्क नहीं पड़ता कि शुरुआती मूल्य @foo क्या हल किया गया है।

तो आपके पहले दो अभिव्यक्तियों के बीच का अंतर यह है कि पहले असाइनमेंट @bar के (अनिर्धारित) मान पर निर्भर है जबकि दूसरे मामले में आप बिना शर्त असाइनमेंट करते हैं। &&=x = x && y के लिए शॉर्टकट नहीं है। यह x = x && y if x के लिए एक शॉर्टकट है।

+0

स्पष्टीकरण के लिए धन्यवाद! इसके अलावा, प्रोग्रामिंग रूबी 1.9 के हिस्से में भी शामिल है जो इसे समझाता है ... शायद इसे देखना चाहिए:/ –

+0

@Alan अपने प्रश्न को हल करने के उत्तर के रूप में मेरी प्रतिक्रिया स्वीकार करने के लिए स्वतंत्र महसूस करें। – hurikhan77

+0

फिर से धन्यवाद :) अभी भी साइट को ढूंढ रहा है ... –

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