以下两种ObjectSpace._id2ref返回的错误之间的区别是什么?

0x... is recycled object (RangeError)

0x... is not id value (RangeError)

最佳答案

not id value意味着没有具有该id的对象。
recycled object表示曾经有一个具有该id的对象,但它已被垃圾回收。
Ruby 1.9.3/Ubuntu上的演示:

x = Object.new
id = x.object_id

puts "0x%x" % id
# => 0x4aef5e8

puts ObjectSpace._id2ref id
# => #<Object:0x95debd0>

x = nil

puts ObjectSpace._id2ref id
# => #<Object:0x95debd0>

GC.start

puts ObjectSpace._id2ref id
# => 0x4aef5e8 is recycled object (RangeError)

注意,Object#to_s中的数字不是object_id-根据docs它是“对象id的编码”。

08-25 18:41