包含模块,它是如何工作的?

Include module , how does it work?

举例:

module Feature
  def self.included(klass)
    puts "#{klass} has included #{self}!"
  end
end

class Container
  include Feature
end

你能解释一下模块如何操作 klass 吗?

找不到任何关于它的明确文档。

问候。

这是 ActiveSupport::Concern 的文档,他们很好地描述了这一点和 "new" 关注方法。

http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

基本上,当您包含一个模块时,它的方法会作为 实例 方法添加到您包含它们的 class 中。当您扩展一个模块时,它们会变成 class 方法。

所以这里发生的事情是,当你包含 Feature 时,Container 获得一个 included class 方法,该方法可以访问 class 本身(使用klass)。由于这种行为,我们可以包含(或扩展)依赖模块。

我认为include只是一种方法。这就是我在 irb 中所做的。

 > require 'pry'
 > module A
 >   def self.included klass
 >     puts "included"
 >   end
 > end
 > class B
 >   binding.pry
 >   include A
 > end

当它进入撬动的时候,我就看到了这个

pry(B)>  self.method(:include)
=> #<Method: Class(Module)#include>

所以我认为 include 是一个方法,并且猜测 include 完成后会调用 include 方法。对不起,我对此没有任何证据。可能需要阅读 ruby 源代码,因为我要求 source_location,但没有得到

 pry(B)> self.method(:include).source_location
 => nil

我觉得ActiveSupport::Concern是用来解决依赖问题的