remove_const和模块的名称

时间:2018-12-12 07:33:40

标签: ruby module constants

standard Ruby documentation for remove_const中,我注意到这一行:

  

如果该常量引用了模块,则不会改变该常量   模块的名称,并可能导致混乱。

这是什么意思?删除/卸载常量与模块名称有什么关系?这指的是什么混乱?

2 个答案:

答案 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,这是它被分配的第一个常量。删除常量不会更改和/或删除模块的名称。