Ruby 为什么attr_访问器在带有extend self的模块中工作?
我在ruby中有一个基本问题,我不知道为什么在使用extend self创建模块时,attr_访问器工作得非常好 据我所知,attr_访问器应该在实例类中工作,但出于某种原因,它在这些模块中工作 这里有一个例子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
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变量可以通过方法来反映这一点。