使用以下代码:
class ObjA
def func
puts "ObjA"
end
end
module Mod
def func
puts "Mod"
end
end
class ObjB < ObjA
include Mod
def func
puts "super called"
super
puts "super.func called"
super.func
end
end
运行ObjB.new.func
会导致:
ruby-1.9.2-p180 :002 > ObjB.new.func
super called
Mod
super.func called
Mod
NoMethodError: undefined method `func' for nil:NilClass
from test.rb:19:in `func'
from (irb):2
我理解super
的作用 - 它调用超类的当前方法。 include Mod
使Mod成为下一个超类,因此调用了Mod#func
。
然而,super.func
在做什么?我认为它等同于super
,但是虽然它打印出相同的输出,但它也会抛出NoMethodError
。
答案 0 :(得分:1)
我认为super.func
会做任何形式的方法链接。它会调用super
,然后对func
返回的结果调用super
。
super
部分会调用Mod#func
,打印出“Mod”,然后在func
的返回值上调用Mod#func
,即nil(因为{{ 1}}返回nil)。由于nil没有puts
方法,所以
func