Ruby中超级关键字

这个代码中的超级代码是什么?

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

据我所知这就像recursion调用函数,对吗?

没有…超级调用父类的方法,如果存在的话。 另外,正如@EnabrenTane指出的那样,它也将所有parameter passing给父类方法。

super用相同的参数调用同名的父方法。 使用inheritance类是非常有用的。

这是一个例子:

 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' 

有多less次可以调用super是没有限制的,所以可以将它与多个inheritance类一起使用,如下所示:

 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会引发exception:

 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关键字可以用来在调用类的超类中调用同名的方法。

它将所有parameter passing给父类方法。

super和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") 

ArgumentError:错误的参数个数(1代表0)

子类中的super(没有圆括号)会调用父方法,并传递给原始方法的参数完全相同 (所以Bar#中的超级变为super(“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"