在Ruby中,为什么inspect()会打印出某种与object_id()不同的对象id?

p函数用于打印对象时,它可能会给出一个ID,它与object_id()给出的不同。 不同数字的原因是什么?

更新: 0x4684abc36971870不同,即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表示:-)