self.included 在一个模块中

self.included in a module

我有一个 class Brand,其中包含一个模块 SimpleURLSanitizer。该模块有一个 class 方法定义如下:

class Brand
  include SimpleURLSanitizer
end

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

由于我们包含模块,它只能访问模块的实例方法。但是 class 方法 included 将在模块包含在 class 中时被调用。 base 就是 Brand class。这个 included 方法在做什么?这个方法里面的self是指模块还是Brandclass?它是如何工作的?

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

included 部分还确保您可以将这些方法作为 class 方法访问。

baseself分别指的是BrandSimpleURLSanitizer。该命令将展开为:

Brand.send(:extend, SimpleURLSanitizer)

可以改写为:

class Brand
  extend SimpleURLSanitizer
end

意味着SimpleURLSanitizer的实例方法也将成为Brand的class方法。