繁体   English   中英

为什么在ruby2.0中object_id为true和nil?

[英]Why was the object_id for true and nil changed in ruby2.0?

我在某个时候遇到过这个 ruby object_id分配问题然后阅读了这篇讨论VALUE的精彩文章 ,并解释了为什么object_id为true,nil和false的方式。 当我发现有关object_id为true和nil的明显变化时,我一直在使用ruby2.0 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: true和nil的值在1.9.3和1.8.7中分别为2,4,但在ruby2.0.0中已经更改为20,8,即使id为false仍然相同,即0和Fixnum的ID保持相同的旧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更改背后的原因是什么?

为什么要做出这种改变? 这对开发者有什么帮助?

查看定义了这些值Ruby源表明这与“flonums”有关(也可参见引入它提交 )。 搜索“flonum” 在Ruby邮件列表上发出了一条消息,讨论它。

这是一种通过使用某些浮点值的立即值来加速64位机器上的浮点计算的技术,类似于使用Fixnums作为整数。 Flonums的模式是...xxxx xx10 (即最后两位是10 ,其中fixnums最后一位是1 )。 其他立即值的object_id已更改为适应此更改。

您可以通过查看Ruby 1.9.3和2.0.0中浮点数的object_id来查看此更改。

在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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM