如何在Ruby中分配对象ID?有些对象有固定的object_id吗?我们可以使用它们的对象_ids来访问它们吗?
答案 0 :(得分:4)
如何“分配”对象ID取决于Ruby实现和OS位数等其他因素。例如,CRuby nil.object_id
在32位上返回4
,在64位上返回8
。
此外nil
是所谓的立即值。 true
,false
,fixnums(小整数),有时甚至浮点数是其他直接值。他们有固定的ID,原因如下:
nil
,一个true
,一个19
等等。但是可以有两个不同的数组请参阅BasicObject#object_id
的文档。您还可以单击以切换源以查看CRuby实现。
调用ObjectSpace._id2ref
按ID检索对象:
id = nil.object_id
ObjectSpace._id2ref(id) # => nil
在一些实现中,该方法可能未实现或实际上很慢。 According to matz它最初是实施weakref
所需的黑客攻击,但当前版本并未将其称为anymore。
答案 1 :(得分:1)
如何在Ruby中分配对象ID?
Ruby语言规范没有说明如何分配ID,只有
请注意,这并不禁止两个不同的对象在不同的时间具有相同的ID,即允许重用ID。
某些对象是否有固定的object_id?
Ruby语言规范没有说明如何分配ID。在某些Ruby实现中,某些对象可能有也可能没有固定ID。
我们可以使用他们的对象_ids来访问它们吗?
在某些实现中,有一个名为ObjectSpace::_id2ref
的方法,但不保证所有实现都存在此方法,并且它可能非常昂贵,并且在某些实现中必须使用命令行开关显式启用。