我们可以使用ruby中的对象_ids访问我们在ruby中创建的对象吗?

时间:2015-07-04 14:08:35

标签: ruby objectid

如何在Ruby中分配对象ID?有些对象有固定的object_id吗?我们可以使用它们的对象_ids来访问它们吗?

2 个答案:

答案 0 :(得分:4)

如何“分配”对象ID取决于Ruby实现和OS位数等其他因素。例如,CRuby nil.object_id在32位上返回4,在64位上返回8

此外nil是所谓的立即值。 truefalse,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

请注意,这并不禁止两个不同的对象在不同的​​时间具有相同的ID,即允许重用ID。

  

某些对象是否有固定的object_id?

Ruby语言规范没有说明如何分配ID。在某些Ruby实现中,某些对象可能有也可能没有固定ID。

  

我们可以使用他们的对象_ids来访问它们吗?

在某些实现中,有一个名为ObjectSpace::_id2ref的方法,但不保证所有实现都存在此方法,并且它可能非常昂贵,并且在某些实现中必须使用命令行开关显式启用。