Подтвердить что ты не робот

Ruby: модули и супер?

Я не понимаю, почему это работает.

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.

4b9b3361

Ответ 1

Да, когда вы включаете модули, они вводятся в цепочку наследования

Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject]

Addon модуль при включении переопределяет существующий метод setup из Base. Если вы хотите вызывать версию Base, используйте super.