У меня есть модуль:
module MM::NN
def test_method
puts "module method called"
end
end
Я пытаюсь включить этот модуль в класс A
для экземпляра в зависимости от параметра, переданного инициализатору экземпляра:
class A
def initialize(add_module)
self.class.send(:include, MM::NN) if add_module
end
end
Я ожидал:
A.new(true).test_method # >> module method called
A.new(false).test_method # >> NoMethodError
Но test_method
определен во всех случаях. Вызов класса с аргументом true
добавляет модуль к экземплярам, созданным позже. Я получил:
A.new(true).test_method # >> module method called
A.new(false).test_method # >> NoMethodError
Инициализация класса с аргументом false
при первом вызове инициализатора и true
во втором даст желаемый результат, так как метод test_method
добавляется позже:
A.new(false).test_method # >> NoMethodError
A.new(true).test_method # >> module method called
потому что модуль привязан к самому классу.
Как сделать метод доступным в определенных случаях, как описано выше?
Как мне решить другой случай:
где class A
наследуют свойства и методы другого class B
, а class B
также содержит test_method
. Как можно использовать модуль TestModule
s test_method
вместо метода внутри class B
.
И каковы различия (или) побочные эффекты при вызове методов при включении модуля в класс:
1) включить модуль за пределами инициализации.
2) Включите модуль внутри инициализации.