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

yey*_*eyo 2 ruby

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解释器中的一些模糊优化有关?

ste*_*lag 7

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

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

  • 请注意,这是YARV的内部私有实现细节.其他Ruby实现可能会也可能不会遵循相同的模式.Ruby所保证的只有1)同一个对象在其生命周期内具有相同的`object_id`和2)两个不同的对象在任何时候都没有同时具有相同的`object_id`.(但是,请注意,两个不同的对象在不同的​​时间可能具有相同的`object_id`,即`object_id`s可以被回收).其他一切都取决于实现者.这里的具体情况是YARV只使用内存地址作为`object_id`并使用标记的... (3认同)