-->

为什么真正的和为零的OBJECT_ID在ruby2.0变化?(Why was the object_

2019-07-22 01:04发布

我碰上了这个红宝石OBJECT_ID分配问题的某个时候回来,然后看这真棒文章其中谈到的价值和解释真实的,零和假会是这样的,为什么OBJECT_ID。 我一直在玩弄ruby2.0 OBJECT_ID时,我发现已经对真实和零OBJECT_ID了明显的变化。

forbidden:~$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]
forbidden:~$
forbidden:~$ irb
irb(main):001:0> true.object_id
=> 20
irb(main):002:0> false.object_id
=> 0
irb(main):003:0> nil.object_id
=> 8
irb(main):004:0> exit
forbidden:~$
forbidden:~$ rvm use 1.9.3
Using /home/forbidden/.rvm/gems/ruby-1.9.3-p392
forbidden:~$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
forbidden:~$
forbidden:~$ irb
irb(main):001:0> true.object_id
=> 2
irb(main):002:0> false.object_id
=> 0
irb(main):003:0> nil.object_id
=> 4

TL; DR: 用于真和零的值分别为2,4和1.9.3 1.8.7,但已被改变为20,8 ruby2.0.0 -尽管虚假的ID保持相同,即0和对于IDS长整数保持相同的老2N + 1种模式。

此外,Fixnum对象和Bignum的实施方式仍然在2.0.0一样的上述文章中给出的例子也运行得它曾经以同样的方式:

irb(main):001:0> 
irb(main):002:0* ((2**62)).class
=> Bignum
irb(main):003:0> ((2**62)-1).class
=> Fixnum
irb(main):004:0>

什么是这背后OBJECT_ID变化的原因?

为什么这种变化做? 这是怎么回事,以帮助开发者?

Answer 1:

一看这些值在那里被定义Ruby源认为,这有事情做与“flonums”(也见犯这个地方介绍 )。 一种“flonum”搜索想出了一个Ruby的邮件列表上的消息讨论它。

这是通过使用即时值某些浮点瓦莱斯,类似于使用Fixnums为整数加快对64台计算机的浮点运算的技术。 对于Flonums图案是...xxxx xx10 (即,最后两个比特是10 ,其中对于fixnums的最后一个比特是1 )。 该object_id等立即值第已经改变,以适应这种变化。

您可以通过观察看到这种变化object_id彩车在Ruby中1.9.3和2.0.0秒。

在具有相同值1.9.3不同彩车是不同的对象:

1.9.3p385 :001 > s = 10.234
 => 10.234 
1.9.3p385 :002 > t = 10.234
 => 10.234 
1.9.3p385 :003 > s.object_id
 => 2160496240 
1.9.3p385 :004 > t.object_id
 => 2160508080 

在2.0.0它们是相同的:

2.0.0p0 :001 > s = 10.234
 => 10.234 
2.0.0p0 :002 > t = 10.234
 => 10.234 
2.0.0p0 :003 > s.object_id
 => 82118635605473626 
2.0.0p0 :004 > t.object_id
 => 82118635605473626 


文章来源: Why was the object_id for true and nil changed in ruby2.0?