self.included in a module

时间:2016-03-07 06:44:31

标签: ruby module metaprogramming mixins

我有一个包含模块Brand的课程SimpleURLSanitizer。该模块有一个类方法定义如下:

class Brand
  include SimpleURLSanitizer
end

module SimpleURLSanitizer
  def self.included base
    base.send :extend, self
  end
end

由于我们包含了模块,因此它只能访问模块的实例方法。但是当模块包含在类中时,将调用类方法includedbaseBrand类。这个included方法在做什么?此方法中的self是指模块还是Brand类?它是如何工作的?

2 个答案:

答案 0 :(得分:1)

当您在课程中包含SimpleURLSanitizer时,SimpleURLSanitizer的所有方法都可以作为实例方法访问。这是默认行为。

included部分也确保您可以作为类方法访问这些方法。

答案 1 :(得分:1)

baseself分别指代BrandSimpleURLSanitizer。该命令将扩展为:

Brand.send(:extend, SimpleURLSanitizer)

可以改写为:

class Brand
  extend SimpleURLSanitizer
end

表示SimpleURLSanitizer的实例方法也将成为Brand的类方法。