Что такое супер в этом коде?
def initialize options = {}, &block
@filter = options.delete(:filter) || 1
super
end
Насколько я знаю, это как вызов функции рекурсивно, правильно?
Что такое супер в этом коде?
def initialize options = {}, &block
@filter = options.delete(:filter) || 1
super
end
Насколько я знаю, это как вызов функции рекурсивно, правильно?
no... super вызывает метод родительского класса, если он существует. Кроме того, как отметил @EnabrenTane, он передает все аргументы методу родительского класса.
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'
Если нет родительского метода с тем же именем, Ruby вызывает исключение:
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’
Ключевое слово super может использоваться для вызова метода с тем же именем в суперклассе класса, вызывающего вызов.
Он передает все аргументы методу родительского класса.
супер не то же самое, что супер()
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")
super (без круглых скобок) внутри подкласса вызовет родительский метод с точно такими же аргументами, которые были переданы исходному методу (поэтому супер внутри Bar # show становится супер ( "Hello Ruby" ) и вызывает ошибку, потому что родительский метод не принимает никаких аргументов)
Bonus:
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"
Super в методе класса, скажем test_method, используется для вызова другого метода с тем же именем, то есть test_method родительского класса. Код, написанный выше и ниже ключевого слова super, будет выполняться в обычном режиме, и вместо ключевого слова super будет включен весь набор действий кода метода super class.