为什么在这里打电话给超级失败

时间:2013-04-12 15:04:53

标签: ruby

 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。

2 个答案:

答案 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的方法,您将收到错误。