object_id一个Fixnum是奇数:
i=0; i += 1 while i.object_id.odd?
# ^CIRB::Abort: abort then interrupt!
i # => 495394962
Run Code Online (Sandbox Code Playgroud)
而似乎object_id任何其他对象的是偶数(Bignum包括):
{}.object_id # => 70230978908220
true.object_id # => 20
false.object_id # => 0
nil.object_id # => 8
/regexp/.object_id # => 70230978711620
:symbol.object_id # => 391528
{/regexp/mou => Struct.new(:hello)}.object_id # => 70230987100840
Run Code Online (Sandbox Code Playgroud)
这是否与Ruby解释器中的一些模糊优化有关?
这样做是为了使整数不占用其他对象的所有空间.在Ruby中,所有其他对象甚至都有object_id,它们介于两者之间.整数object_id很容易转换为它们的值:最后一位(总是1)被切断.
整数是一些假对象,它们只不过是一个id和一个共享的方法列表.