Что делает 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#func называется.

Тем не менее, что является super.func делать? Я думал, что это будет эквивалентно super, но пока он выводит тот же вывод, он также выдает NoMethodError,

1 ответ

Решение

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

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

NoMethodError: undefined method `func' for nil:NilClass
    from test.rb:19:in `func'
    from (irb):2
Другие вопросы по тегам