我正在研究 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
谢谢!
最佳答案
当您调用 extend ActiveSupport::Concern
时,它会查找 ClassMethods 内部模块,并以此扩展您的“宿主”类。然后它将为您提供一个 included
方法,您可以将一个 block 传递给:
included do
some_function
end
included
方法将在被包含类的上下文中运行。如果您有一个模块需要另一个模块中的函数,ActiveSupport::Concern
将为您处理依赖关系。
关于ruby - 使用扩展 ActiveSupport::Concern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14917117/