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 への呼び出しは to に行きObject、次に to に行き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 に答える