我在 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 的这个“实例”?
模块有两个上下文,“实例”上下文指的是 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.
| 归档时间: |
|
| 查看次数: |
583 次 |
| 最近记录: |