remove_const 和模块名称

Sau*_*nda 1 ruby module constants

的标准 Ruby 文档remove_const中,我注意到这一行:

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

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

saw*_*awa 5

当使用名称定义模块时A

module A; end
a = A
Run Code Online (Sandbox Code Playgroud)

那么它的名字是"A",所以你可以这样称呼它A(通过它的名字):

a.name # => "A"
A # => A
Run Code Online (Sandbox Code Playgroud)

但如果你取消定义A

self.class.send(:remove_const, :A)
Run Code Online (Sandbox Code Playgroud)

那么你就不能再打电话A了:

A # >> NameError: uninitialized constant A
Run Code Online (Sandbox Code Playgroud)

但其名称仍为"A"

a.name # => "A"
a # => A
Run Code Online (Sandbox Code Playgroud)

这大概就是所谓的迷惑吧。