在Ruby中,您可以使用ObjectSpace._id2ref(n)
返回对object_id n的对象的引用。例如:
$ a = "foo"
$ a.object_id
70142658775260
$ ObjectSpace._id2ref(a.object_id)
"foo"
我正在探索这个并希望知道object_id 4
是哪个对象,但是ObjectSpace._id2ref(4)
会引发以下RangeError
:
RangeError: 0x00000000000004 is not id value
我的理解是,在Ruby 2.0之前,nil
的对象id固定为4,但在Ruby 2.0中nil
的对象ID为8. There's an explanation for this here。
是否因为没有对象将4作为固定对象ID而引发错误?如果是这样,某些对象foo
是否可能在运行时被分配object_id
4?
答案 0 :(得分:1)
是的,你是对的,在2.0及之后,将没有id为4的对象,并且无法创建具有该id的对象。
排除特殊内置类型(nil
,false
,true
,符号和数字),对象的ID取自其内存地址,并假设32位机器,地址需要有4字节对齐,这意味着地址的最后2位将为0。
如果是这种情况,那么理论上id 4仍然是对象的有效地址,因此是有效的id,但是该对象将存在于无效的内存地址中,因为它很可能已经被使用了要在其虚拟地址空间中运行的program itself。