加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么ruby2.0中的object_id为true和nil已更改?

发布时间:2020-12-16 19:42:06 所属栏目:百科 来源:网络整理
导读:我经历了 this年的ruby object_id分配问题,然后阅读了这个关于VALUE的这个很棒的 article,并解释了为什么object_id为true,以及它们的方式为false.当我发现对object_id为true和nil的明显变化时,我一直在使用ruby2.0 object_id. forbidden:~$ruby -vruby 2.0.0
我经历了 this年的ruby object_id分配问题,然后阅读了这个关于VALUE的这个很棒的 article,并解释了为什么object_id为true,以及它们的方式为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,即使false的id保持不变,即0和Fixnum的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改变背后的原因是什么?

为什么这个变化呢?这将如何帮助开发人员?

解决方法

看看 Ruby source where these values are defined表明这与“flonums”有关(也见 commit where this was introduced).搜索“flonum”提出了一个 message on the Ruby mailing list讨论它.

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

您可以通过查看Ruby 1.9.3和2.0.0中的floats的object_ids来查看此更改.

在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读