Ruby 为什么超级呼叫在这里失败了
Ruby 为什么超级呼叫在这里失败了,ruby,Ruby,foo”:super:no超类方法#(NoMethodError) 我假设在这种情况下,对super的调用将转到Object,然后转到BasicObject,最后返回false 为什么我没有超类方法foo 我使用的是ruby 1.9.3。Super在父类上调用相同名称的方法 module A def foo if super.respond_to? :foo puts 'super responded to :foo' end end end
foo”:super:no超类方法#(NoMethodError)
我假设在这种情况下,对super的调用将转到Object
,然后转到BasicObject
,最后返回false
为什么我没有超类方法foo
我使用的是ruby 1.9.3。Super在父类上调用相同名称的方法
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
编辑:
你可能想做一些类似的事情
if super.respond_to? foo
作为检查。您的代码没有真正意义:您使用一个条件来保护对
super
的调用,但无论如何,您都是在该条件下调用super
。换句话说:您正在调用super
,以确定调用super
是否安全。因此,如果祖先链中没有名为foo
的方法,您将得到一个错误。+1用于超越对super.response\u to?
的错误调用,并想象解决方案(self.祖先。选择
)是一个坏例子。已修复。您仍在状态中调用super
。您刚刚删除了由该条件保护的对super
的调用。我重复一遍:调用super
以检查是否可以调用super
根本不起作用。这毫无意义。如果未定义super
,则您希望阻止调用它,但您调用了super
,以确定它是否已定义。
self.ancestors.select{|a| a.respond_to? :foo}.size > 0