माणिक में नेस्टेड विधि परिभाषाओं भ्रमित कर रहे हैं।
वे वास्तव में redefinitions हैं!
क्या होता है कि दोनों परिभाषाएं बाहरी संदर्भ पर लागू होती हैं। यह दोनों परिभाषाएं एक ही (!) विधि foo को परिभाषित करती हैं। हालांकि बाहरी परिभाषा का अर्थ तब होता है जब फ़ाइल पढ़ी जाती है, जबकि आंतरिक परिभाषा का अर्थ केवल तभी किया जाता है जब बाहरी विधि को पहली बार बुलाया जाता है। इसके बाद यह प्रारंभिक परिभाषा को प्रतिस्थापित करेगा।
इस कोड
def foo
def foo
1
end
end
चलो इस के माध्यम से चलना चलो देखते हुए:
- जब आपकी फ़ाइल एक वैश्विक विधि
foo
लोड हो रहा है शरीर def foo; 1; end
साथ परिभाषित किया गया है।
जब आप foo()
फोन इस वैश्विक विधि मार डाला जाता है और वैश्विक विधिfoo
को पुनर्परिभाषित शरीर 1
के साथ, और nil
रिटर्न के बाद से एक विधि को परिभाषित कोई वापसी मूल्य है।
जब आप कॉल foo().foo()
वैश्विक विधि मार डाला और 1
, जिस पर वैश्विक विधि फिर से क्रियान्वित किया जाता है देता है, 1
फिर से लौट रहा है।
यहाँ भ्रामक दो बातें, एक) है कि नेस्टेड विधि परिभाषा दोनों एक ही बाहरी गुंजाइश के लिए लागू करते हैं और ख) एक वैश्विक विधि किसी भी वस्तु पर कहा जा सकता है कि कर रहे हैं।
यह दिखाने के लिए एक और उदाहरण है कि कैसे नेस्टेड परिभाषा वास्तव में परिभाषाओं को परिभाषित करती है।
class A
def m(arg=nil)
def m; 42; end if arg
23
end
end
यहाँ क्या होता है
a = A.new
a.m # => 23
a.m # => 23
a.m(:magic) # => 23
a.m # => 42
a.m # => 42
के रूप में आप देख सकते हैं, नेस्टेड परिभाषा वास्तव में एक नई परिभाषा है।
असल में यह पहली बार शून्य आता है, बी/सी रूबी प्रथम श्रेणी के तरीकों का समर्थन नहीं करता है (इस अर्थ में कम से कम)। तो कोई विधि वस्तु वापस नहीं आती है। – trans