super。<method-name>在ruby中做什么?</method-name>

时间:2011-06-16 03:14:48

标签: ruby super

使用以下代码:

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

1 个答案:

答案 0 :(得分:1)

我认为super.func会做任何形式的方法链接。它会调用super,然后对func返回的结果调用super

super部分会调用Mod#func,打印出“Mod”,然后在func的返回值上调用Mod#func,即nil(因为{{ 1}}返回nil)。由于nil没有puts方法,所以

func