में सुपर कीवर्ड इस कोड में सुपर क्या है?रूबी
def initialize options = {}, &block
@filter = options.delete(:filter) || 1
super
end
जहां तक मुझे पता है कि यह फ़ंक्शन को बार-बार कॉल करने जैसा है, है ना?
में सुपर कीवर्ड इस कोड में सुपर क्या है?रूबी
def initialize options = {}, &block
@filter = options.delete(:filter) || 1
super
end
जहां तक मुझे पता है कि यह फ़ंक्शन को बार-बार कॉल करने जैसा है, है ना?
नहीं ... सुपर, माता पिता के वर्ग की प्रणाली को बुलाती है यदि वह मौजूद है। साथ ही, जैसा कि @ एनाब्रेनटेन ने बताया, यह सभी तर्कों को मूल वर्ग विधि में भी पास करता है।
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’
" सुपर उसी के एक माता पिता प्रणाली को बुलाती है नाम, एक ही तर्क के साथ। " एक * unadorned * 'सुपर 'उन्हें एक ही तर्क के साथ बुलाता है। ऐसा कुछ भी नहीं है जो कहता है कि बच्चे माता-पिता को पैरामीटर का उप-समूह पास नहीं कर सकता है, अगर माता-पिता यही लेते हैं। –
@the टिन मैन: पर्याप्त सच है। – vonconrad
महान उदाहरण - उन्हें लिखने के लिए धन्यवाद! – ckib16
सुपर कीवर्ड वर्ग कॉल करने की सुपर क्लास में एक ही नाम के एक विधि कॉल करने के लिए इस्तेमाल किया जा सकता है।
यह माता पिता के वर्ग विधि के लिए सभी तर्कों से गुजरता है।
सुपर सुपर()
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")
सुपर (कोष्ठकों के बिना) उपवर्ग के भीतर बिल्कुल साथ माता पिता विधि कॉल करेंगे एक ही तर्क है कि मूल विधि को पारित किए गए (ताकि सुपर अंदर बार # शो सुपर हो जाता है ("हैलो रूबी") और के कारण त्रुटि माता पिता विधि किसी भी तर्क लेता नहीं है क्योंकि)
बहुत अच्छी व्याख्या! धन्यवाद! –
बोनस:
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"
और डिफ़ॉल्ट रूप से के रूप में बुलाया वहाँ से गुजरता है माता-पिता समारोह के रूप में अच्छी तरह से – EnabrenTane
@Enabren बहुत अच्छा बिंदु मैं उल्लेख करने में विफल करने के लिए दिए गए तर्कों। मैं इसे – sethvargo
भी जोड़ देंगे, अगर आप 'सुपर (लिखना)' 'बजाय super' की, कोई तर्क माता पिता की विधि को दे दिया जाएगा: http://bit.ly/hsQtfD – splicer