31

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

更新: 0x4684abc与 不同36971870,即0x234255E

>> a = Point.new
=> #<Point:0x4684abc>

>> a.object_id
=> 36971870

>> a.__id__
=> 36971870

>> "%X" % a.object_id
=> "234255E"
4

2 回答 2

53

的默认实现inspect调用的默认实现,它只是直接显示对象的十六进制值,如文档to_s中所见(单击方法描述以显示源代码)。Object#to_s

同时,C 源代码中实现的注释object_id表明,Ruby 值和对象 ID 有不同的“命名空间”,具体取决于对象的类型(例如,除了 Fixnums 之外,最低位似乎为零)。Object#object_id 您可以在文档中看到(单击以显示来源)。

从那里我们可以看到,在“对象 id 空间” (object_idinspect从右边的第三位开始(前两位为零)。因此,要将值从“对象 id 空间”转换为“值空间”,我们可以将object_id向左移动一位并得到相同的结果,如下所示inspect

> '%x' % (36971870 << 1)
=> "4684abc"

> a = Foo.new
=> #<Foo:0x5cfe4>
> '%x' % (a.object_id << 1)
=> "5cfe4"
于 2010-05-12T12:53:27.570 回答
1
0x234255E

=>36971870

没有什么不同,它是内存地址的十六进制表示:-)

于 2010-05-12T12:13:42.850 回答