Ruby 为什么attr_访问器在带有extend self的模块中工作?

Ruby 为什么attr_访问器在带有extend self的模块中工作?,ruby,module,Ruby,Module,我在ruby中有一个基本问题,我不知道为什么在使用extend self创建模块时,attr_访问器工作得非常好 据我所知,attr_访问器应该在实例类中工作,但出于某种原因,它在这些模块中工作 这里有一个例子 module A extend self attr_accessor :custom_method def foo self.custom_method end end A.custom_method # => nil A.foo # => nil

我在ruby中有一个基本问题,我不知道为什么在使用extend self创建模块时,attr_访问器工作得非常好

据我所知,attr_访问器应该在实例类中工作,但出于某种原因,它在这些模块中工作

这里有一个例子

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"
那么,使用.custom_方法会发生什么呢?从现在起,整个应用程序都会被“禁止”吗


如何销毁一个模块的“实例”?

模块有两个上下文,“实例”上下文指的是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\u level
方法以及该上下文中的任何其他方法也将起作用。您正在使模块级别成为mixin 1的超集

除去常数A,就没有办法消除短路。是单身汉


需要注意的是,Rails简化了创建这些模块的过程,而不需要
扩展self

模块有两个上下文,“实例”上下文指的是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\u level
方法以及该上下文中的任何其他方法也将起作用。您正在使模块级别成为mixin 1的超集

除去常数A,就没有办法消除短路。是单身汉


值得注意的是,Rails简化了创建这些文件的过程,而无需
扩展self

“我有一个基本问题[…]”-
扩展self
看起来天真简单,但结果可能令人难以置信。为了理解发生了什么,删除该行并扩展另一个对象可能更容易,比如
obj=object.new;obj.extend(A)
。你知道
extend
做什么吗?“我有一个基本问题[…]”-
extend self
看起来天真而简单,但结果可能令人难以置信。为了理解发生了什么,删除该行并扩展另一个对象可能更容易,比如
obj=object.new;obj.extend(A)
。你知道
extend
做什么吗?回答很好,但是属性访问器中的数据集存储在哪里?与往常一样,在执行该方法时,无论
self
是什么。如果这是另一个对象调用的mixin方法
include
on,那么它将进入该对象。如果你说的是
A.foo
,那么它会进入A对象:
A.instance\u变量
通过方法可以反映这一点。回答很好,但是attr\u访问器中的数据集存储在哪里?与往常一样,在执行该方法时,无论
self
是什么。如果这是另一个对象调用的mixin方法
include
on,那么它将进入该对象。如果您谈论的是
A.foo
,那么它会进入A对象:
A.instance\u变量可以通过方法来反映这一点。