2011-01-08 6 views
41

में सुपर कीवर्ड इस कोड में सुपर क्या है?रूबी

def initialize options = {}, &block 
    @filter = options.delete(:filter) || 1 
    super 
end 

जहां तक ​​मुझे पता है कि यह फ़ंक्शन को बार-बार कॉल करने जैसा है, है ना?

उत्तर

54

नहीं ... सुपर, माता पिता के वर्ग की प्रणाली को बुलाती है यदि वह मौजूद है। साथ ही, जैसा कि @ एनाब्रेनटेन ने बताया, यह सभी तर्कों को मूल वर्ग विधि में भी पास करता है।

+9

और डिफ़ॉल्ट रूप से के रूप में बुलाया वहाँ से गुजरता है माता-पिता समारोह के रूप में अच्छी तरह से – EnabrenTane

+1

@Enabren बहुत अच्छा बिंदु मैं उल्लेख करने में विफल करने के लिए दिए गए तर्कों। मैं इसे – sethvargo

+39

भी जोड़ देंगे, अगर आप 'सुपर (लिखना)' 'बजाय super' की, कोई तर्क माता पिता की विधि को दे दिया जाएगा: http://bit.ly/hsQtfD – splicer

49

super एक ही नाम के एक माता पिता प्रणाली को बुलाती है, एक ही तर्क के साथ। विरासत कक्षाओं के लिए उपयोग करना बहुत उपयोगी है।

यहाँ एक उदाहरण है:

class Foo 
    def baz(str) 
    p 'parent with ' + str 
    end 
end 

class Bar < Foo 
    def baz(str) 
    super 
    p 'child with ' + str 
    end 
end 

Bar.new.baz('test') # => 'parent with test' \ 'child with test' 

कितनी बार आप super कॉल कर सकते हैं करने के लिए कोई सीमा नहीं है, तो यह, कई विरासत में मिला वर्गों के साथ इसका इस्तेमाल किया जा सकता है इस तरह:

class Foo 
    def gazonk(str) 
    p 'parent with ' + str 
    end 
end 

class Bar < Foo 
    def gazonk(str) 
    super 
    p 'child with ' + str 
    end 
end 

class Baz < Bar 
    def gazonk(str) 
    super 
    p 'grandchild with ' + str 
    end 
end 

Baz.new.gazonk('test') # => 'parent with test' \ 'child with test' \ 'grandchild with test' 

यदि बहुत हालांकि, उसी नाम की कोई मूल विधि नहीं है, रूबी ने अपवाद उठाया:

class Foo; end 

class Bar < Foo 
    def baz(str) 
    super 
    p 'child with ' + str 
    end 
end 

Bar.new.baz('test') # => NoMethodError: super: no superclass method ‘baz’ 
+5

" सुपर उसी के एक माता पिता प्रणाली को बुलाती है नाम, एक ही तर्क के साथ। " एक * unadorned * 'सुपर 'उन्हें एक ही तर्क के साथ बुलाता है। ऐसा कुछ भी नहीं है जो कहता है कि बच्चे माता-पिता को पैरामीटर का उप-समूह पास नहीं कर सकता है, अगर माता-पिता यही लेते हैं। –

+0

@the टिन मैन: पर्याप्त सच है। – vonconrad

+0

महान उदाहरण - उन्हें लिखने के लिए धन्यवाद! – ckib16

16

सुपर कीवर्ड वर्ग कॉल करने की सुपर क्लास में एक ही नाम के एक विधि कॉल करने के लिए इस्तेमाल किया जा सकता है।

यह माता पिता के वर्ग विधि के लिए सभी तर्कों से गुजरता है।

सुपर सुपर()

class Foo 
    def show 
    puts "Foo#show" 
    end 
end 

class Bar < Foo 
    def show(text) 
    super 

    puts text 
    end 
end 


Bar.new.show("Hello Ruby") 

ArgumentError के समान नहीं है: तर्कों की गलत संख्या (1 0 के लिए)

सुपर (कोष्ठकों के बिना) उपवर्ग के भीतर बिल्कुल साथ माता पिता विधि कॉल करेंगे एक ही तर्क है कि मूल विधि को पारित किए गए (ताकि सुपर अंदर बार # शो सुपर हो जाता है ("हैलो रूबी") और के कारण त्रुटि माता पिता विधि किसी भी तर्क लेता नहीं है क्योंकि)

+0

बहुत अच्छी व्याख्या! धन्यवाद! –

0

बोनस:

module Bar 
    def self.included base 
     base.extend ClassMethods 
    end 

    module ClassMethods 
     def bar 
      "bar in Bar" 
     end 
    end 
end 

class Foo 
    include Bar 
    class << self 
     def bar 
      super 
     end 
    end 
end 

puts Foo.bar # => "bar in Bar"