【问题标题】:use of extend ActiveSupport::Concern使用扩展 ActiveSupport::Concern
【发布时间】:2013-02-01 18:01:45
【问题描述】:

我正在研究 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

谢谢!

【问题讨论】:

    标签: ruby activesupport


    【解决方案1】:

    当您调用extend ActiveSupport::Concern 时,它会寻找一个 ClassMethods 内部模块,并以此扩展您的“主机”类。然后它将为您提供included 方法,您可以将块传递给:

    included do
     some_function
    end
    

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

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 2020-09-21
      • 2011-09-05
      • 2012-09-14
      • 1970-01-01
      • 2014-04-28
      • 2013-05-26
      • 2013-09-05
      • 2013-12-20
      相关资源
      最近更新 更多