Я не понимаю, почему это работает.
module Base
attr_reader :first
def setup
@first = 1
end
end
module Addon
attr_reader :second
def setup
#super
@second = 2
end
end
class Test
include Base
include Addon
def initialize(num)
@num = num
setup
end
end
a = Test.new(1)
p a.first
p a.second
В принципе у меня есть "базовый" модуль, который настраивает некоторые вещи. У меня также есть модуль аддона, который устанавливает некоторые другие вещи, если какой-то класс хочет включить его.
Теперь, когда я тестирую его, если у меня нет этого супервызов, я получаю
nil
2
Когда у меня есть супер-вызов, я получаю
1
2
Что действительно делает супер? Он вызывает метод установки из базового модуля, даже если Base и Addon не связаны.
Это первый раз, когда я использовал супер в контексте модулей. Раньше я всегда пользовался супер-вызовами с классами и думал, что он просто подошел к дереву наследования, чтобы найти родителя с тем же методом.
Включает несколько модулей, также устанавливающих какое-то дерево наследования?
EDIT: для контекста модуль Addon никогда не будет включен без базового модуля, и базовый модуль всегда будет включен перед любыми дополнительными модулями Addon.