我在某个时候遇到了这个ruby object_id 分配问题,然后阅读了这篇很棒的文章,它讨论了 VALUE 并解释了为什么 object_id 的 true、nil 和 false 是这样的。当我发现关于 true 和 nil 的 object_id 的明显变化时,我一直在玩弄 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 变化背后的原因是什么?
为什么会做出这样的改变?这将如何帮助开发人员?