gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:24 24 4
gpt4 key购买 nike

检查是否定义了 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

最佳答案

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

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

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

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

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

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

关于ruby - 删除常量导致常量仍然可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50429539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com