2
 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 methodfoo' for # (NoMethodError)

我假设在这种情况下,对 super 的调用会先到Object然后再到BasicObject,最后会返回 false。

为什么我得到no superclass method foo

我正在使用 ruby​​ 1.9.3 。

4

2 回答 2

3

Super调用父类上的同名方法。

if super.respond_to? foo

该行将在层次结构中的任何父类上调用 foo。

编辑:

你可能想做类似的事情

self.ancestors.select{|a| a.respond_to? :foo}.size > 0

作为支票。

于 2013-04-12T15:11:56.550 回答
0

您的代码实际上没有意义:您使用条件来保护调用,但无论如何super您都是在该条件下调用。super换句话说:你打电话super是为了确定打电话是否安全superfoo因此,如果祖先链中没有调用任何方法,您将收到错误消息。

于 2013-04-12T15:35:11.737 回答