Как разделить методы между модулями ruby - PullRequest
3 голосов
/ 01 сентября 2011

Вот что я попробовал:

module A
  def self.method1; "method1"; end
  def method2; "method2"; end
end

module B; include A; end

B.method1  # => error
B.method2  # => error
B::method1 # => error
B::method2 # => error

Я хочу избежать копирования и вставки эквивалентного кода между двумя модулями. Причина, по которой я использую модули вместо классов, заключается в том, что мне не нужно более одного экземпляра каждого модуля, поскольку они просто содержат константы (другие модули, на данный момент).

Как лучше всего решить эту проблему?

Ответы [ 2 ]

7 голосов
/ 01 сентября 2011

Обычный include только дает вам методы экземпляра (method2 в вашем конкретном фрагменте кода).Если вы хотите поделиться методами уровня модуля - извлеките их в отдельный модуль и extend других модулей с ним:

module A
  extend self     # to be able to use A.method1

  def method1
    "method1"
  end
end

module B
  extend A
end

B.method1       # => "method1"

Также возможно получить методы уровня модуля с помощью include, но смаленький поворот, используя метод крюка:

module A
  def self.included(other)
    other.extend ModuleMethods    # this is where the magic happens
  end

  def instance_method
    'instance method'
  end

  module ModuleMethods
    def module_method
      'module method'
    end
  end

  extend ModuleMethods     # to be able to use A.module_method
end


module B
  include A
end

B.module_method        #=> "module method"
B.instance_methods     #=> [:instance_method]
1 голос
/ 01 сентября 2011

Прежде всего, обратите внимание, что A.method2 тоже не будет работать. Вы можете создавать объекты, включая A (или B), которые будут иметь method2:

class C
  include B    # (or A)
end
c = C.new
c.method2

Итак, для method2 это работает так, как вы и планировали.

Что касается method1, это одноэлементный метод объекта A, и его невозможно унаследовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...