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