Ruby - модуль расширения внутри другого модуля
Я пытаюсь определить пару модулей, которые легко добавить в некоторые методы экземпляра и класса другим классам, вот что я делаю:
module Foo
module Bar
def speak
puts "hey there"
end
end
module Baz
extend Foo::Bar
def welcome
puts "welcome, this is an instance method"
end
end
end
class Talker
include Foo::Baz
end
Talker.new.welcome
Talker.speak
Результат этого:
welcome, this is an instance method
undefined method 'speak' for Talker.class (NoMethodError)
Я ожидал, что Talker будет использовать метод "говорить", поскольку он включает Foo:: Baz, который сам расширяет Foo:: Bar.
Что мне не хватает?
Ответы
Ответ 1
Вы можете попробовать следующее:
module Baz
extend Foo::Bar
def self.included(base)
base.send :extend, Foo::Bar
end
def welcome
puts "welcome, this is an instance method"
end
end
Это автоматически расширит все классы, в которые включен Baz.
Ответ 2
попробуйте следующее:
class Talker
extend Foo::Baz
end
так как вы хотите вызвать Talker.speak как метод класса, а не как метод экземпляра (например, Talker.new.speak), вы должны включить Foo: Baz таким образом, чтобы класс использовал сами методы.
Одна из возможностей состоит в том, чтобы использовать 'extend' (как указано выше), другой изменяет его eigenclass:
class Talker
class << self
include Foo::Baz
end
end