Ruby 使用extend-ActiveSupport::Concern

Ruby 使用extend-ActiveSupport::Concern,ruby,activesupport,Ruby,Activesupport,我正在研究CodeSchool的RubyBits,我遇到了一个我不理解的练习:“确保AtariLibrary类只包含LibraryUtils模块,并让ActiveSupport::Concern负责加载其依赖项。然后,在LibraryUtils上重构self.include方法以使用include方法” 根据下面的解决方案,似乎ActiveSupport::Concern不负责加载依赖项-您需要在LibraryUtils中包含LibraryLoader 您能否帮助我了解一下ActiveSuppo

我正在研究CodeSchool的RubyBits,我遇到了一个我不理解的练习:“确保AtariLibrary类只包含LibraryUtils模块,并让ActiveSupport::Concern负责加载其依赖项。然后,在LibraryUtils上重构self.include方法以使用include方法

根据下面的解决方案,似乎
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内部模块,并使用该模块扩展您的“host”类。然后,它将为您提供一个
包含的
方法,您可以将一个块传递给:

包括您自己
某些函数
结束
included
方法将在所包含类的上下文中运行。如果您有一个模块需要另一个模块中的函数,
ActiveSupport::Concern
将为您处理依赖关系

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