Я столкнулся с этим вопросом о распределении ruby object_id когда-нибудь назад, а затем прочитал эту замечательную статью, который говорит о VALUE и объясняет, почему object_id true, nil и false так, как они есть. Я работал с ruby2.0 object_id, когда обнаружил очевидное изменение, которое было сделано в отношении object_id true и nil.
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 были соответственно 2, 4 в 1.9.3 и 1.8.7, но были изменены на 20, 8 в ruby2.0.0 - хотя идентификатор false остается тем же, что и 0, и идентификаторы для Fixnum сохраняют один и тот же старый шаблон 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>
В чем причина изменения этого объекта?
Почему было сделано это изменение? Как это поможет разработчикам?