2012-07-09 23 views
18

मुझे समझ में नहीं आता कि यह क्यों काम करता है।रूबी: मॉड्यूल और सुपर?

module Base 
    attr_reader :first 
    def setup 
    @first = 1 
    end 
end 

module Addon 
    attr_reader :second 
    def setup 
    #super 
    @second = 2 
    end 
end 

class Test 
    include Base 
    include Addon 

    def initialize(num) 
    @num = num 
    setup 
    end 
end 

a = Test.new(1) 
p a.first 
p a.second 

असल में मेरे पास "आधार" मॉड्यूल है, जो कुछ सामान सेट करता है। मेरे पास एक एडन मॉड्यूल भी है, जो कुछ वर्ग स्थापित करता है यदि कुछ वर्ग इसे शामिल करना चाहता है।

अब मैं इसे जब परीक्षण, अगर मुझे लगता है कि सुपर कॉल की जरूरत नहीं है, मैं

nil 
2 

मिल जब मैं सुपर कॉल की क्या ज़रूरत है, मैं

1 
2 

मिल सुपर वास्तव में क्या करता है यहाँ करो यह आधार मॉड्यूल से सेटअप विधि को कॉल कर रहा है, भले ही बेस और एडन संबंधित न हों।

यह पहली बार है जब मैंने मॉड्यूल के संदर्भ में सुपर का उपयोग किया है। पहले मैंने कक्षाओं के साथ हमेशा सुपर कॉल का इस्तेमाल किया था और सोचा था कि यह एक ही विधि के साथ माता-पिता को खोजने के लिए विरासत के पेड़ पर जा रहा था।

क्या कई मॉड्यूल भी कुछ प्रकार के विरासत पेड़ की स्थापना कर रहे हैं?

संपादित करें: संदर्भ के लिए, एडन मॉड्यूल को बेस मॉड्यूल के बिना कभी भी शामिल नहीं किया जाएगा, और बेस मॉड्यूल हमेशा किसी भी अतिरिक्त एडन मॉड्यूल से पहले शामिल किया जाएगा।

+0

मुझे लगता है कि आप सही हैं। विधि हस्ताक्षर शायद एक ढेर में संग्रहीत किए जाते हैं और सुपर बस उस वस्तु को संदेश में एक गहराई में संदेश भेजता है। दिलचस्प लगता है कि मैं कहूंगा! – Candide

उत्तर

23

हाँ, जब आप मॉड्यूल में शामिल हैं, वे विरासत श्रृंखला में इंजेक्शन कर रहे हैं

Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject] 

Addon मॉड्यूल, जब शामिल है, Base से मौजूदा setup विधि को पुनर्परिभाषित। यदि आप Base के संस्करण को कॉल करना चाहते हैं, तो super का उपयोग करें।

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