2015-04-04 45 views
2

object_id是奇数:为什么`Fixnum`的`object_id`是一个奇数?一个<code>Fixnum</code>的

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

+0

@CarySwoveland''0.object_id'产生'1'(在我的irb会话中)。也许这与我使用的ruby版本有关。 – yeyo 2015-04-04 21:31:43

+0

我错过了。谢谢。 – 2015-04-04 21:35:29

+0

符号和浮动(除非可能非常大)似乎甚至有对象ID。 – 2015-04-04 21:36:17

回答

6

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

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

+0

这是有道理的。你知道那些与符号和浮游物等其他直接物体相关的东西是如何处理的吗? – 2015-04-04 21:47:12

+0

@CarySwoveland号我甚至不知道直接的对象是什么。无,真假似乎有固定的ID。 – steenslag 2015-04-04 21:53:27

+3

请注意,这是YARV的内部专用实施细节。其他Ruby实现可能也可能不遵循相同的模式。所有由Ruby保证的是1)同一个对象在其生命周期中具有相同的'object_id',并且2)在任何时候两个不同的对象在同一时间都不具有相同的'object_id'。 (但是,请注意,两个不同的对象可以在不同的时间具有相同的'object_id',即'object_id'可以被回收)。其他一切都取决于实现者。这里的具体情况是,YARV只是使用内存地址作为'object_id',并使用'Fixnum'的标记... – 2015-04-04 22:25:35

相关问题