为什么 attr_accessor 在带有扩展自我的模块中工作?

Luc*_*rez 0 ruby module

我在 ruby​​ 中有一个基本问题,我不知道为什么在创建带有扩展 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"
Run Code Online (Sandbox Code Playgroud)

那么,A.custom_method 会发生什么?从现在开始,它会在整个应用程序中成为“bar”吗?

我怎样才能破坏 A 的这个“实例”?

tad*_*man 5

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

module Example
  def mixin_level
    :mixed
  end

  def self.module_level
    :module
  end
end
Run Code Online (Sandbox Code Playgroud)

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

Example.module_level
# => :module

Example.mixin_level
# => NoMethodError: undefined method `mixin_level' for Example:Module
Run Code Online (Sandbox Code Playgroud)

如果您做到了这一点,extend self那么该mixin_level方法以及该上下文中的任何其他方法也将起作用。您正在使模块级别成为 mixin 的超集。

没有办法销毁 A short 删除 A 常量。是单身狗。

需要注意的是,Railsmattr_accesor简化了创建这些的过程,而无需extend self.