包含模块,它是如何工作的?
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是用来解决依赖问题的
举例:
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是用来解决依赖问题的