为什么`Fixnum`的`object_id`是奇数?

Fixnum object_id是一个奇数:

 i=0; i += 1 while i.object_id.odd? # ^CIRB::Abort: abort then interrupt! i # => 495394962 

而似乎任何其他对象的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 

这是否与Ruby解释器中的一些模糊优化有关?

这样做是为了使整数不占用其他对象的所有空间。 在Ruby中,所有其他对象甚至都有object_id,它们介于两者之间。 整数object_id很容易转换为它们的值:最后一位(总是1)被切断。

整数是一些假对象,它们只不过是一个id和一个共享的方法列表。