2013-02-17 50 views
3

我正在通過CodeSchool的RubyBits工作,我參加了一個練習,我只是不理解:「確保AtariLibrary類僅包含LibraryUtils模塊並讓ActiveSupport :: Concern請注意加載它的依賴關係,然後重構LibraryUtils上的self.included方法以使用包含的方法。「使用擴展ActiveSupport :: Concern

module LibraryLoader 

    extend ActiveSupport::Concern 

    module ClassMethods 
    def load_game_list 
    end 
    end 
end 

module LibraryUtils 
    def self.included(base) 
    base.load_game_list 
    end 
end 

class AtariLibrary 
    include LibraryLoader 
    include LibraryUtils 
end 

基於該解決方案(如下圖),好像ActiveSupport::Concern並不需要加載依賴護理 - 您需要包括LibraryUtils內LibraryLoader。

您能幫我理解ActiveSupport::Concern正在做什麼,以及爲什麼需要在兩個模塊中通過extend調用?

module LibraryLoader 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def load_game_list 
    end 
    end 
end 

module LibraryUtils 
    extend ActiveSupport::Concern 
    include LibraryLoader 

    #result of refactoring the self.included method 
    included do 
    load_game_list 
    end 
end 

class AtariLibrary 
    include LibraryUtils 
end 

謝謝!

回答

2

當你調用extend ActiveSupport :: Concern時,它會查找一個ClassMethods內部模塊,並用它擴展你的'主機'類。然後,它會爲您提供一個「包括」方法,它可以傳遞一個塊:

包括做 some_function 端

該方法包括將所述包含類的上下文中運行。如果您的模塊需要其他模塊中的功能,則ActiveSupport :: Concern將負責爲您提供依賴關係。