删除常量导致常量仍然可用

Removing constant results in constant still being available

检查是否定义了 Object 常量

Module.const_defined?('Object')
#=> true

删除常量

Object.send(:remove_const, 'Object')
#=> Object

检查,Object 常量已删除

Module.const_defined?('Object')
#=> false

下面的例子return如何把Object常量去掉? :)

String.superclass
#=> Object
new_object = String.superclass.new
#=> #<Object:0x00007fdc18382858>
new_object.class
#=> Object

Now, how do the following examples return the Object constant if it is removed?

他们没有。他们不能。 Ruby 中的常量不是 object,因此,它们 不可能 return ::Object 常量。

他们可以,然而,return一个object用字符串'Object'响应inspect。 object,恰好与 now-removed ::Object 常量引用的 object 相同。

删除常量会删除常量。而已。特别是,它 不会 删除常量引用的 object。 IFF 该常量是 对 object 的引用,THEN object 现在将有资格获得垃圾 collection。但这里不是这种情况:::Object 常量不是对 Object class 的唯一引用,因为 Object [=] 的每个子 class 57=] 在其 superclass 指针中引用了 Object class 并且 Object class 的每个实例都引用了 Object class 在其 class 指针中。另外,执行引擎的内部数据结构可能会或可能不会引用 Object class.

因此,Object class 几乎永远不会被垃圾回收,并且您将始终对它有一些引用,您可以通过它访问它,例如''.class.superclass 将允许您访问 Object class 而不管 ::Object 常量是否仍然存在。

简而言之:您将常量 ::Object 与此常量引用的 object 混淆了。这是一个常见的初学者错误。然而,事物名称和事物本身之间的区别在几乎所有编程语言中都是根本