2012-01-01 12 views
5

इस article से प्रेरित, मैं रूबी विधि कॉलिंग पदानुक्रम के साथ खेल रहा था और कुछ अजीब देखा।रूबी विधि-कॉलिंग पदानुक्रम

को देखते हुए:

class B 
    def foo 
    "- Instance method defined by B" 
    end 

    def method_missing(method) 
    puts "- method_missing (#{method}) on b. Redirecting to b.foo\n" 
    foo 
    end 
end 

b = B.new 

def b.foo 
    "- Method defined directly on an instance of B\n" + super 
end 

def b.method_missing(method) 
    "- method_missing (#{method}) on b. Calling super\n" + super 
end 

puts "Calling 'bar' on b of type #{b.class}:" 
puts b.bar 

चल रहा है यह देता है:

Calling 'bar' on b of type B: 
- method_missing (bar) on b. Redeirecting to b.foo 
- method_missing (bar) on b. Calling super 
- Method defined directly on an instance of B 
- instance method defined by B 

मेरा प्रश्न है:

जब से मैं बोल रहा हूँ b.bar (वस्तु पर), कैसे वर्ग के उदाहरण आना objet की आवृत्ति विधि कहा जाता है इससे पहले विधि कहा जाता है?

मैं, उम्मीद है | b.method_missing(method) पहले के नाम से जाना तो वर्ग के उदाहरण method_missing(method) (के बाद से मैं सुपर बोल रहा हूँ? लेकिन सुपर वर्ग पदानुक्रम ... है) जो bar से foo पर रीडायरेक्ट करता है। इसके अलावा, कैसे आते हैं, foo पर रीडायरेक्ट होने के बाद, उदाहरण के missing_method को कॉल किया जाता है? हमें अभी बताया गया था कि हमें पुनर्निर्देशित किया जा रहा है ...

मुझे लगता है कि मुझे इस अवधारणा को समझ में नहीं आता कि कैसे रूबी एक वर्ग (मेरे लिए नया) के उदाहरण पर एक उदाहरण विधि को परिभाषित करने की अनुमति देता है, के विपरीत इसे कक्षा (क्लासिक भाषाओं) की एक उदाहरण विधि के रूप में परिभाषित करना।

मुझे आशा है कि इस सवाल का समझ में आता है, हो सकता है मेरे सिर अभी भी कल रात से स्पिन हो रही है ...

+1

मैं वापसी मान के साथ b.method_missing में स्ट्रिंग आउटपुट ऊपर देखा समस्या को और स्पष्ट बनाने के लिए अप्रासंगिक कोड हटा दिया गया। एक समस्या का * न्यूनतम * उदाहरण प्रदान करना आम तौर पर एक अच्छा विचार है। –

उत्तर

4

समस्या यह है कि अपने उत्पादन निष्पादन की वास्तविक क्रम को प्रतिबिंबित नहीं करता है। के उत्पादन पर एक नज़र लेते हैं:

method_missing (bar) on b. Redeirecting to b.foo 
method_missing (bar) on b. Calling super 

पहली नज़र में, इस धारणा है कि B#method_missing सिंगलटन विधि b.method_missing जो दो सवाल आप का वर्णन उठाती से पहले कहा जाता है देता है। दरअसल, b.method_missing सही ढंग से पहले कहा जाता है। यह स्पष्ट हो जाता है, तो आप कैसे बयान puts b.bar मूल्यांकन किया जाता है पर नज़र डालें:

  1. b कोई विधि bar है, तो b.method_missing एक तर्क के रूप स्ट्रिंग 'bar' साथ कहा जाता है।
  2. b.method_missing बदले में super कीवर्ड के उपयोग के माध्यम से विधि को कॉल करता है।
  3. B#method_missing उत्पादन के लिए puts का उपयोग करता है पहली पंक्ति
  4. सिंगलटन विधि b.foo कहा जाता है
  5. सबसे बाहरी puts किया जाता है, जिनमें से b.foo
+2

+1; मुझे इससे हराएं। –

+0

निकलास, स्पष्टीकरण (और अप्रासंगिक कोड को हटाने) के लिए धन्यवाद। आपके उत्तर के लिए धन्यवाद! – dynex

+0

पाठ्यक्रम के डीबगर में इसे चलाने से इसे स्पष्ट किया जाता है। मुझे यह शुरू करना चाहिए था - माफ करना दोस्तों, और आपके धैर्य के लिए धन्यवाद। – dynex

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