在standard Ruby documentation for remove_const
中,我注意到这一行:
如果该常量引用了模块,则不会改变该常量 模块的名称,并可能导致混乱。
这是什么意思?删除/卸载常量与模块名称有什么关系?这指的是什么混乱?
答案 0 :(得分:3)
使用名称A
定义模块时,
module A; end
a = A
其名称为"A"
,因此您可以将其命名为A
(以其名称):
a.name # => "A"
A # => A
但是,如果您未定义A
:
self.class.send(:remove_const, :A)
然后您将无法再呼叫A
:
A # >> NameError: uninitialized constant A
,但其名称仍为"A"
:
a.name # => "A"
a # => A
这可能是混淆的意思。
答案 1 :(得分:2)
第一次将模块分配给常数时,将自动设置模块的名称。但是,在取消分配模块时,它不会自动取消设置。这可能会造成混淆。
请参阅:
a = Module.new
a.name #=> nil
a.to_s #=> '#<Module:0x00007f91b38625f8>'
a.inspect #=> '#<Module:0x00007f91b38625f8>'
A = a
a.name #=> 'A'
a.to_s #=> 'A'
a.inspect #=> 'A'
B = a
B.name #=> 'A'
B.to_s #=> 'A'
B.inspect #=> 'A'
self.class.send(:remove_const, :A)
a = nil
B.name #=> 'A'
B.to_s #=> 'A'
B.inspect #=> 'A'
现在,您只能通过常量B
来引用模块,但是模块的名称仍然是A
,这是它被分配的第一个常量。删除常量不会更改和/或删除模块的名称。