module A
def foo
if super.respond_to? :foo
puts 'super responded to :foo'
end
end
end
class Lab
include A
end
puts Lab.ancestors.inspect #=> Lab, A, Object, Kernel, BasicObject]
Lab.new.foo
foo': super: no superclass method
foo'代表#(NoMethodError)
我假设在这种情况下,对super的调用将转到Object
然后转到BasicObject
,最后会返回false。
为什么我得到no superclass method foo
?
我正在使用ruby 1.9.3。
答案 0 :(得分:3)
Super在父类上调用相同名称的方法。
if super.respond_to? foo
该行将在层次结构中的任何父类上调用foo。
编辑:
您可能想要做类似
的事情self.ancestors.select{|a| a.respond_to? :foo}.size > 0
作为支票。
答案 1 :(得分:0)
你的代码真的没有意义:你用一个条件保护对super
的调用,但无论如何你在那个条件下调用super
。换句话说:您正在呼叫super
以确定呼叫super
是否安全。因此,如果祖先链中没有名为foo
的方法,您将收到错误。