2012-04-15 2 views
17

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

module Helper 
    def time 
     Time.now.year 
    end 
end 

module ApplicationHelper 
    # Inherit from Helper here... 
end 

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

ответ

22

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

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 
+0

Я никогда не думал об использовании модуля внутри другого, спасибо за помощь! – beakr

+7

Я не уверен, что объявление помощника внутри ApplicationHelper делает, кроме скрыть его из глобального кода. Важно то, что «include» (и «extend») работает как для модулей, так и для классов. –

1

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

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

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

+0

Здесь у вас есть предложения include внутри вашего определения метода, что, вероятно, не является правильным способом для этого ... Это хорошее предупреждение против записи включает внутри определения методов. Включение должно быть вне определения метода, как в ответе DigitalRoss – emery

Смежные вопросы