3

检查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
4

1 回答 1

4

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

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

但是,它们可以返回一个响应inspect字符串的对象'Object'。一个对象,恰好与现在被移除的::Object常量引用的对象相同。

删除常数会删除常数。而已。特别是,它不会删除常量引用的对象。如果该常量是对该对象的唯一引用,那么该对象现在将有资格进行垃圾回收。但这里不是这样:::Object常量不是对Object类的唯一引用,因为类的每个子类在其指针中都有对类的Object引用,并且类的每个实例在其指针中都有对类的引用。另外,执行引擎的内部数据结构可能有也可能没有对类的引用。ObjectsuperclassObjectObjectclassObject

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

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

于 2018-05-20T00:59:13.223 回答