Что делает super. <Method-name> в ruby?

Со следующим кодом:

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

Я предполагаю, что super.func будет делать то же самое, что и любая форма цепочки методов. Он вызывает super, а затем вызывает func в результате, возвращаемом super.

Часть super вызывается Mod#func, которая выводит "Mod", затем вызывает func по возвращаемому значению Mod#func, то есть nil (это потому, что puts возвращает nil). Поскольку nil не имеет метода func, он говорит

NoMethodError: undefined method `func' for nil:NilClass
    from test.rb:19:in `func'
    from (irb):2