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

时间:2015-05-07 11:13:53

标签: ruby-on-rails ruby module include

以示例:

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

class Container
  include Feature
end

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

无法找到任何有关它的明确文档。

问候。

2 个答案:

答案 0 :(得分:2)

我认为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完成时调用包含方法。对不起,我对此没有任何明显的看法。可能必须阅读ruby源代码,因为我要求source_location,但得到了nil

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

我认为ActiveSupport :: Concern用于解决依赖性问题

答案 1 :(得分:1)

这是ActiveSupport::Concern的文档,它们可以很好地描述这个和#34;新的&#34;关注方法。

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

基本上,当您包含模块时,其方法将作为实例方法添加到您包含它们的类中。当您扩展模块时,它们将成为方法。

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