删除常量导致常量仍然可用
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 混淆了。这是一个常见的初学者错误。然而,事物名称和事物本身之间的区别在几乎所有编程语言中都是根本。
检查是否定义了 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 混淆了。这是一个常见的初学者错误。然而,事物名称和事物本身之间的区别在几乎所有编程语言中都是根本。