ruby - расширить модуль внутри другого модуля - PullRequest
19 голосов
/ 30 марта 2011

Я пытаюсь определить пару модулей, чтобы легко добавить некоторые методы экземпляра и класса в другие классы, вот что я делаю:

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.

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

Ответы [ 2 ]

21 голосов
/ 30 марта 2011

Вы можете попробовать это:

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.

PS:

extend Foo::Bar в module Baz был в оригинальном фрагменте, этот код не влияет на метод def self.included(base).

4 голосов
/ 30 марта 2011

попробуйте это:

class Talker
   extend Foo::Baz
end

поскольку вы хотите вызывать Talker.speak как метод класса, а не как метод экземпляра (например, Talker.new.speak), вы должны включить Foo: Baz так, чтобы класс сам принимал методы.

Одной из возможностей является использование «extension» (как указано выше), другая - изменение собственного класса:

class Talker
  class << self
    include Foo::Baz
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...