2012-04-15 76 views
17

我正在製作一個Rails小程序,其中包含我在ApplicationHelper模塊內部的模塊內部構建的一些方法。這裏有一個例子:使模塊繼承Ruby中的另一個模塊

module Helper 
    def time 
     Time.now.year 
    end 
end 

module ApplicationHelper 
    # Inherit from Helper here... 
end 

我知道ApplicationHelper < Helperinclude 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 2012-04-15 01:15:20

+7

我不確定ApplicationHelper裏面的Helper聲明是什麼,除了把它從全局代碼中隱藏起來。重要的是'include'(和'extend')適用於模塊和類。 – 2012-04-15 05:08:38

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

在這裏,您的方法定義中包含了包含語句,這可能不是正確的方法...這是寫入內部方法定義時很好的警告。在DigitalRoss的答案中,include應該在方法定義之外 – emery 2016-04-06 20:24:08