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

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.

Что мне не хватает?

4b9b3361

Ответ 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