nop*_*ole 30 ruby object object-identity
当该p函数用于打印出一个对象时,它可能会给出一个ID,它与object_id()给出的不同.不同数字的原因是什么?
更新: 0x4684abc不同于36971870,是0x234255E
>> a = Point.new
=> #<Point:0x4684abc>
>> a.object_id
=> 36971870
>> a.__id__
=> 36971870
>> "%X" % a.object_id
=> "234255E"
Ark*_*kku 49
默认实现inspect调用默认实现to_s,它只是直接显示对象的十六进制值,如Object#to_s 文档中所示(单击方法描述以显示源).
同时,实现中的C源代码中的注释object_id表明,对于Ruby值和对象id,存在不同的"命名空间",具体取决于对象的类型(例如,除了Fixnums之外,最低位似乎为零).您可以在Object#object_id docs中看到(单击以显示源代码).
从那里我们可以看到,在"对象id空间"(返回object_id)中,对象的id从右边的第二位开始(第一位为零),但在"值空间"(由inspect它们使用)时,它们开始从右边的第三位开始(前两位为零).因此,要将值从"对象ID空间"转换为"值空间",我们可以object_id向左移一位,并获得与以下所示相同的结果inspect:
> '%x' % (36971870 << 1)
=> "4684abc"
> a = Foo.new
=> #<Foo:0x5cfe4>
> '%x' % (a.object_id << 1)
=> "5cfe4"