我正在使用CodeSchool的RubyBits并且我参加了一个我不理解的练习:“确保AtariLibrary类只包含LibraryUtils模块,让ActiveSupport :: Concern负责加载它然后,重构LibraryUtils上的self.included方法以使用包含的方法。“
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
谢谢!
答案 0 :(得分:5)
当您调用extend ActiveSupport :: Concern时,它将查找ClassMethods内部模块,并将使用它扩展您的“主机”类。然后它将为您提供一个“包含”方法,您可以将块传递给:
包含了 some_function 端
包含的方法将在包含的类的上下文中运行。如果您的模块需要另一个模块中的函数,ActiveSupport :: Concern将为您处理依赖项。