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