【发布时间】:2018-05-19 21:12:59
【问题描述】:
检查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
【问题讨论】:
-
您是否尝试过使用比
Object和String更不特别的东西? -
@muistooshort tbh 我没有。但我现在不认为它应该与不那么特别的东西有任何区别,因为常数是常数。为什么不同的常数会有不同的表现?
-
因为
Object和String不只是任何旧常量,它们是语言本身的特性。你不能说'Object'而不与String类交互(因此Object),你不能说Module而不与Object交互,你不能调用一个方法而不与@交互987654338@ 以各种方式(至少通过Method和Symbol)。如果您没有Object,那么您就没有Ruby。您试图从一个非常特殊的具体案例进行推理,最好从更一般的案例开始。 -
Module#remove_const 的文档指出,“删除给定常量的定义,返回该常量的先前值。如果该常量引用了一个模块,则不会更改该模块的名称并可能导致困惑。”更根本的是,你能想象 Matz 允许用户删除类
Object(或BassicObject)吗?可以想象,这可以达到什么目的?请注意,附带条件是指所有模块,包括自定义模块。顺便说一句,我认为文档可以改进。