a
यहां, आप a
का मूल्यांकन कर रहे हैं, जिसे परिभाषित नहीं किया गया है। इसलिए, आपको अपवाद मिलता है।
a || 1
यहाँ, आप अभी भीa
मूल्यांकन करने के लिए बूलियन अभिव्यक्ति का मूल्य निर्धारित करने के लिए है। ऊपर की तरह, a
परिभाषित नहीं किया गया है। इसलिए, आपको अपवाद मिलता है।
a = a || 1
यहाँ, a
परिभाषित किया गया है। इसे एक अनियमित स्थानीय चर माना जाता है। रूबी में, अप्रारंभीकृत चर nil
का मूल्यांकन, इसलिए काम अभिव्यक्ति की दाहिने हाथ की ओर nil || 1
जो 1
का मूल्यांकन करने के लिए मूल्यांकन करता है, इसलिए काम अभिव्यक्ति की वापसी मान 1
है और दुष्प्रभाव यह है कि a
1
को आरंभ नहीं हो जाता है।
संपादित करें: ऐसा लगता है कि जब चर को परिभाषित किया जाता है और जब वे रूबी में प्रारंभ होते हैं तो कुछ भ्रम होता है। पार्स समय पर परिभाषित किया गया है लेकिन रनटाइम पर प्रारंभ किया गया। आप इसे यहां देख सकते हैं:
foo # => NameError: undefined local variable or method `foo' for main:Object
foo
अपरिभाषित है।
if false
foo = 'This will never get executed'
end
इस बिंदु पर, foo
परिभाषित किया गया है, भले ही लाइन निष्पादित हो कभी नहीं होगा। तथ्य यह है कि रेखा कभी निष्पादित नहीं होती है, पूरी तरह से अप्रासंगिक है, क्योंकि दुभाषिया के पास इसके साथ कुछ भी करने का कोई अधिकार नहीं है: स्थानीय चर को पार्सर द्वारा परिभाषित किया जाता है, और पार्सर स्पष्ट रूप से इस रेखा को देखता है।
foo # => nil
कोई त्रुटि है, क्योंकि foo
परिभाषित किया गया है, और यह nil
का आकलन करती है क्योंकि यह अप्रारंभीकृत है।
स्रोत
2010-06-06 09:12:57
http://stackoverflow.com/questions/1462407/ruby-edge-cases का डुप्लिकेट –