我在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的这个“实例”?
答案 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
即可简化创建这些内容。