检查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
答案 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
与此常量引用的对象混淆。这是一个常见的初学者错误。但是,几乎所有编程语言中,事物名称和事物本身之间的区别都是基本。