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