2013-03-19 9 views
13

私はthis ruby​​ object_id割り振りの質問に戻ってきました。そして、この素晴らしい、articleを読んで、VALUEについて語り、object_idがtrue、nil、falseの理由を説明します。私はtrueとnilのobject_idに関する明らかな変更を見つけたときにruby2.0のobject_idを使っていました。ruby​​2.0でtrueとnilの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であった、1.9.3および1.8.7に4が、20に変更されている、ruby2.0.0 8 - さえfalseのIDは同じままですが、つまりFixnumのidは同じ古い2n + 1パターンを維持します。何

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> 

:上記の記事で与えられた例は、また、それがために使用されるだけで同じように実行しても

、FixnumかとBIGNUMが実装されている方法はまだ2.0.0で同じですこのobject_idの変更理由

なぜこの変更が行われましたか?これは開発者をどのように助けるでしょうか?

+0

多分彼らはいくつかのより多くの内部オブジェクトを追加したので、これらの値を変更しました...彼らはどれも数字であることは保証されていませんか?とにかく、あなたはruby-develメーリングリストに尋ねることができました... – rogerdpack

+0

'true.object_id'と' nil.object_id'が変更されたのはどういう意味ですか?特定の値を持つことは保証されておらず、 'ruby'を別々に呼び出しても同じ値であることが保証されているかどうかは疑問です。 –

+0

私はWindowsマシンでRuby2.0を使用していますが、何も変更されていません。 –

答えて

17

Ruby source where these values are definedを見ると、これは「flonums」(commit where this was introducedも参照)と関係があることが示唆されています。 「flonum」の検索では、message on the Ruby mailing listがそれを議論していた。

整数用のFixnumを使用するのと同様に、浮動小数点値の即値を使用して64ビットマシン上の浮動小数点計算を高速化する方法です。 Flonumsのパターンは...xxxx xx10である(すなわち、最後の2ビットはであり、fixnumの場合は最後のビットは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 
関連する問題