删除常量结果仍然可用

时间:2018-05-19 21:13:00

标签: ruby ruby-2.5

检查Object常量是否已定义

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

删除常量

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

检查,Object常量被移除

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

现在,如果删除Object常量,以下示例如何返回? :)

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

1 个答案:

答案 0 :(得分:3)

  

现在,如果删除Object常量,以下示例如何返回?{/ p>

他们没有。他们不能。常量不是Ruby中的对象,因此,它们不可能返回::Object常量。

然而,

他们可以返回一个对象,该对象使用字符串inspect响应'Object'。一个对象,恰好是现在删除的::Object常量引用的同一个对象。

删除常量会删除常量。而已。特别是,它删除常量引用的对象。 IFF 该常量是该对象的唯一引用,那么该对象现在可以进行垃圾回收了。但这不是这种情况:::Object常量不是Object类的唯一引用,因为Object类的每个子类都引用Object superclass指针中的类,Object类的每个实例都在其Object指针中引用class类。此外,执行引擎的内部数据结构可能会也可能不会引用Object类。

因此,Object类几乎不会收集垃圾,并且您将始终对其进行一些引用,通过它可以访问它,例如无论''.class.superclass常量是否仍然存在,Object都会授予您访问::Object类的权限。

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