以示例:
module Feature
def self.included(klass)
puts "#{klass} has included #{self}!"
end
end
class Container
include Feature
end
你能解释一下模块如何操纵klass吗?
无法找到任何有关它的明确文档。
问候。
答案 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
)。由于这种行为,我们可以例如包括(或扩展)依赖模块。