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

Can we access the objects we created in ruby using their object _ids in ruby?

Ruby中的对象 ID 是如何分配的?某些对象是否固定 object_id?我们可以使用它们的对象 _id 访问它们吗?

如何“分配”对象 ID 取决于 Ruby 实现和其他因素,例如 OS 位数。例如,在 32 位的 CRuby nil.object_id returns 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 it was originally a hack needed to implement weakref but current versions don't call it anymore.

How are the object IDs assigned in Ruby?

Ruby 语言规范没有说明 ID 的分配方式,仅说明

  • 对象在其生命周期内必须具有相同的 ID
  • 任何两个对象不能同时具有相同的 ID

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

Do some objects have fixed object_id?

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

Can we access them using their object _ids?

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