Что делает super.‹имя-метода› в 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.


person David Miani    schedule 16.06.2011    source источник


Ответы (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
person Andrew Grimm    schedule 16.06.2011
comment
Спасибо, это объясняет (я проверил, добавив ObjA.new в конец метода Mod#func - это не приводит к ошибке метода и выводит ObjA). - person David Miani; 16.06.2011