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

Создание модуля наследуется от другого модуля в Ruby

Я делаю небольшую программу для Rails, которая включает некоторые из моих методов, которые я встроил внутри модуля внутри модуля ApplicationHelper. Вот пример:

module Helper
    def time
        Time.now.year
    end
end

module ApplicationHelper
    # Inherit from Helper here...
end

Я знаю, что ApplicationHelper < Helper и include Helper будут работать в контексте класса, но что вы будете использовать для наследования модулей-модулей? Спасибо.

4b9b3361

Ответ 1

Фактически вы можете определить модуль внутри другого модуля, а затем включить его внутри внешнего.

so ross$ cat >> mods.rb
module ApplicationHelper
  module Helper
    def time
      Time.now.year
    end
  end
  include Helper
end

class Test
  include ApplicationHelper
  def run
    p time
  end
  self
end.new.run
so ross$ ruby mods.rb
2012

Ответ 2

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

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

module ApplicationHelper
  def self.included(base)
    base.class_eval do
      include Helper
      include InstanceMethods
    end
  end

  module InstanceMethods
    def new_method
      #..
    end
  end

end

Новые методы не определены непосредственно в ApplicationHelper, поскольку include Helper будет выполняться после определений метода, заставляя их перезаписываться Helper. Альтернативно можно определить методы внутри блока class_eval