irb(main)> foo = true unless defined?(Integer)
=> nil
irb(main)> foo = true unless defined?(thisIsUndefined)
=> true
आपका पहला ब्लॉक nil
लौटा रहा है क्योंकि जिस तरह से यह पत्ते लिखा है 2 विकल्प:
foo
परिभाषित नहीं है -> सच आवंटित
foo
परिभाषित किया गया है -> कुछ नहीं कर
यहां, लाइन का मूल्यांकन होने पर foo को परिभाषित किया जाना चाहिए। इस प्रकार, कुछ भी नहीं होता है और nil
लौटा दिया जाता है।
irb(main)> unless defined?(Integer) ; fooo = false ; end
=> nil
irb(main)> unless defined?(thisIsUndefined) ; fooo = false ; end
=> false
आपका दूसरा ब्लॉक उसी तरह से चलता है जैसा आपका पहला करता है। यदि fooo
परिभाषित नहीं किया गया है, तो ब्लॉक दर्ज किया गया है और fooo
false
पर सेट है। ब्लॉक की आखिरी पंक्ति का परिणाम ब्लॉक का रिटर्न वैल्यू है, इस प्रकार आप false
देख रहे हैं। यदि fooo
मौजूद है, तो ब्लॉक छोड़ दिया गया है और कुछ नहीं होता है, इसलिए वापसी करने के लिए कुछ भी नहीं है, इसलिए nil
।
आपके कोड के आधार पर, मैं कहूंगा कि foo
परिभाषित किया गया था जब यह कोड चलाया गया था और fooo
नहीं था (रूबी 1.8.6 में दिखाया गया परीक्षण कोड उत्पन्न हुआ था)। यदि आपने इस कोड को चलाने से पहले इनमें से किसी एक को परिभाषित नहीं किया है, तो आपके पास foo
नामक कुछ हो सकता है जिसे डिफ़ॉल्ट रूप से परिभाषित किया गया है (defined?(foo)
स्वयं जांचने के लिए)। एक अलग नाम का उपयोग करने का प्रयास करें और देखें कि क्या आपको एक ही परिणाम मिलते हैं।
संपादित करें:
irb(main)> defined?(bar)
=> nil
irb(main)> bar = true unless defined?(bar)
=> nil
irb(main)> defined?(bar)
=> "local-variable"
जाहिर है, defined?()
सच लौटने के बाद से यह पहले से ही bar
देखा गया है (लाइन की शुरुआत में) है, भले ही आप इसे परिभाषित करने की प्रक्रिया में हैं।
रूबी किस संस्करण का उपयोग कर रहे हैं? – bta
वैरिएबल को असाइन करने की इस बात के साथ जब तक कि वे पहले ही परिभाषित नहीं हो जाते हैं, मुझे यह इंगित करने के लिए मजबूर होना पड़ता है कि 'foo || = true' एक ही चीज़ को पूरा करता है (और हमेशा' सत्य 'देता है)। –
@ एलिसन आर। यदि नहीं 'foo' परिभाषित किया गया है लेकिन गलत है। – FMc