为什么attr_accessor在带有extend self的模块中工作?

时间:2017-09-06 15:52:51

标签: ruby module

我在ruby中有一个基本问题,我不知道为什么在使用extend self创建模块时,attr_accessor工作正常。

据我所知,attr_accessor应该在一个实例类中工作,但是对于某些实例类,它可以在这些模块中工作。

这是一个例子

module A
  extend self
  attr_accessor :custom_method

  def foo
    self.custom_method
  end
end

A.custom_method # => nil
A.foo # => nil
A.custom_method = "bar" # => "bar"
A.custom_method # => "bar"
A.foo # => "bar"

那么,A.custom_method会发生什么?从现在起整个申请是否会成为“酒吧”?

我如何摧毁A的这个“实例”?

1 个答案:

答案 0 :(得分:4)

模块有两个上下文,“实例”上下文指的是mixin方法。通过调用extend self,您可以直接在模块上调用mixin方法。

module Example
  def mixin_level
    :mixed
  end

  def self.module_level
    :module
  end
end

默认情况下,您只能在正确的上下文中调用它们:

Example.module_level
# => :module

Example.mixin_level
# => NoMethodError: undefined method `mixin_level' for Example:Module

如果您执行extend self技巧,则mixin_level方法以及该上下文中的任何其他方法也可以使用。你正在使模块级别成为mixin的超集。

没有办法摧毁A的常数。这是一个单身人士。

作为备注,Rails有mattr_accesor,无需extend self即可简化创建这些内容。