When the p
function is used to print out an object, it may give an ID, and it is different from what object_id()
gives. What is the reason for the different numbers?
Update: 0x4684abc
is different from 36971870
, which is 0x234255E
>> a = Point.new
=> #<Point:0x4684abc>
>> a.object_id
=> 36971870
>> a.__id__
=> 36971870
>> "%X" % a.object_id
=> "234255E"
It's not different, it's the hexadecimal representation of the memory address:-)
The default implementation of
inspect
calls the default implementation ofto_s
, which just shows the hexadecimal value of the object directly, as seen in theObject#to_s
docs (click on the method description to reveal the source).Meanwhile the comments in the C source underlying the implementation of
object_id
shows that there are different “namespaces” for Ruby values and object ids, depending on the type of the object (e.g. the lowest bit seems to be zero for all but Fixnums). You can see that inObject#object_id
docs (click to reveal the source).From there we can see that in the “object id space” (returned by
object_id
) the ids of objects start from the second bit on the right (with the first bit being zero), but in “value space” (used byinspect
) they start from the third bit on the right (with the first two bits zero). So, to convert the values from the “object id space” to the “value space”, we can shift theobject_id
to the left by one bit and get the same result that is shown byinspect
: