Что делает 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