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