2013-10-25 9 views
10

एक ताजा शुरू कर दिया सत्र से निम्नलिखित आईआरबी टुकड़ा पर विचार करें:का अजीब अर्थ || और || = रूबी में (2.0, 1.9.3, JRuby 1.7.4)

irb:01> baz   # => NameError, baz is not defined 
irb:02> baz || baz = 0 # => NameError, baz is not defined 
irb:03> baz   # => nil 

baz एक अपरिभाषित चर और यह उत्पादन का मूल्यांकन करने की कोशिश कर रहा था एक NameError। फिर भी, किसी भी तरह, इस ऑपरेशन के बाद, baz परिभाषित किया गया था, और इसका मूल्य nil है। मान लीजिए, मान nil वैरिएबल baz को असाइन किया गया था, भले ही कोई भी (स्पष्ट रूप से) इसके लिए नहीं पूछा गया हो। क्या कोई अंतर्निहित भाषा कारण है कि यह व्यवहार वांछनीय है?

क्या नियम है कि इस व्यवहार और इस तरह के अन्य इसी भ्रामक निर्माणों, बताते है:

irb:04> true if foo   # => NameError 
irb:05> foo     # => NameError; name still undefined 
irb:06> foo = (true if foo) # => nil 
irb:07> foo     # => nil; name defined as nil 
irb:08> true || i = 0 || j = 2 # => i and j are nil; || appears nonlazy 
irb:09> raise || quux = 1  # => RuntimeError, quux is nil 
+3

आप वास्तव में अपने किसी भी उदाहरण में '|| =' का उपयोग नहीं कर रहे हैं, प्रश्न शीर्षक थोड़ा भ्रामक है – nzifnab

+0

और भी अजीब बात: 'स्पैम # => नाम त्रुटि; >> स्पैम || = "अंडे" # => "अंडे"; >> स्पैम # => "अंडे" '। असंगत। – iamnotmaynard

+0

संभावित डुप्लिकेट [फॉरेसी के अंदर असाइनमेंट ऑपरेशन के साथ भ्रम \ "अगर \' ब्लॉक] (http://stackoverflow.com/questions/15183576/confusion-with-the-assignment-operation-ins-the-fallacy-if -ब्लॉक) –

उत्तर

9

अगर यह वांछनीय है मैं नहीं जानता, लेकिन यह कैसे रूबी कोड को पार्स करता है से आता है। जब भी आपके पास कोड का एक टुकड़ा होता है जो स्थानीय चर निर्दिष्ट करता है, तो स्थानीय चर को nil असाइन किया जाता है भले ही कोड का उस टुकड़े का मूल्यांकन नहीं किया जाता है। अपने कोड पंक्ति 2,:

baz || baz = 0 

पहले baz त्रुटि दी क्योंकि ऐसी कोई चर सौंपा गया था। इसलिए काम baz = 0 इस प्रकार है कि यह किया गया था मूल्यांकन नहीं, लेकिन फिर भी यह पार्स, तो संदर्भ में पालन करने के लिए, एक स्थानीय चर baz बनाया गया था, और nil को आरंभ नहीं हो जाता था।

आपके दूसरे कोड खंड के साथ, footrue if foo और foo के दौरान असाइन नहीं किया गया है। उसके बाद, foo = (true if foo) में foo पर असाइनमेंट है, इसलिए (true if foo) का मूल्यांकन foo के आकलन से पहले किया जाता है, उस पंक्ति में कोई त्रुटि नहीं उठाई जाती है।

+1

मेरी टिप्पणी को मिटाना है क्योंकि आपने अपना जवाब तय कर दिया है ;-) अब यह सही है, बाज़ को असाइनमेंट ** ** नहीं किया गया है, लेकिन जब भी रूबी ** पार्सर ** असाइनमेंट का पता लगाता है, तो यह एक स्थान आवंटित करता है यह और 'शून्य 'पर सेट है। –

+0

@ डेविड यूनिक आप मेरे उत्तर में कुछ कहने के लिए कह सकते थे जैसा कि पहले था, लेकिन अब, मुझे नहीं लगता कि आपकी टिप्पणी मेरे उत्तर से परे कोई भी जानकारी जोड़ती है। – sawa

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