2013-03-19 26 views
13

Ich stolperte this ruby ​​object_id Allokation Frage irgendwann zurück und dann lesen Sie diese wunderbare article, die über Wert spricht und warum object_id von wahr, null und falsch, wie sie sind. Ich habe mit ruby2.0 object_id gespielt, als ich die scheinbare Änderung fand, die bezüglich object_id von true und nil gemacht wurde.Warum wurde die object_id für true und nil in ruby2.0 geändert?

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:Die Werte für den tatsächlichen nil wurden jeweils 2, 4 in 1.9.3 und 1.8.7, haben aber bis 20, 8 in ruby2.0.0 geändert wurde - auch obwohl die ID von Falsch gleich bleibt, dh 0, und die IDs für Fixnum das gleiche alte 2n + 1-Muster beibehält.

Auch die Art und Weise Fixnum und Bignum umgesetzt werden, ist immer noch das gleiche in 2.0.0 wie das Beispiel in dem oben erwähnten Artikel angegeben auch nur die gleiche Art und Weise ausgeführt wird, um es verwendet:

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> 

Was das ist Grund hinter dieser object_id Änderung?

Warum wurde diese Änderung vorgenommen? Wie wird das Entwicklern helfen?

+0

vielleicht fügten sie noch einige interne Objekte, so dass es änderte diese Werte ... sie sind nicht garantiert, irgendeine Zahl sind sie? Wie auch immer, du könntest auf der Ruby-devel-Mailingliste fragen ... – rogerdpack

+0

Warum ist es wichtig, ob 'true.object_id' und' nil.object_id' geändert werden? Es ist nicht garantiert, dass sie bestimmte Werte haben, und ich bezweifle, dass sie sogar in verschiedenen Aufrufen von 'Ruby' identisch sind. –

+0

Ich benutze Ruby2.0 in Windows-Rechner, für mich hat sich nichts geändert. –

Antwort

17

Ein Blick auf die Ruby source where these values are defined deutet darauf hin, dass dies etwas mit "Flonums" zu tun hat (siehe auch die commit where this was introduced). Eine Suche nach "flonum" ergab eine message on the Ruby mailing list Diskussion darüber.

Dies ist eine Technik zur Beschleunigung von Gleitkommaberechnungen auf 64-Bit-Maschinen, indem für einige Gleitkommawerte Direktwerte verwendet werden, ähnlich wie bei Fixnums für Ganzzahlen. Das Muster für Flonums ist ...xxxx xx10 (d. H. Die letzten zwei Bits sind 10, wobei für Fixnummern das letzte Bit 1 ist). Die object_id s anderer Sofortwerte wurden geändert, um dieser Änderung Rechnung zu tragen.

Sie können diese Änderung sehen, indem Sie die object_id s von Schwimmern in Ruby 1.9.3 und 2.0.0 betrachten.

In 1.9.3 verschiedenen Schwimmer mit dem gleichen Wert sind verschiedene Objekte:

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 

In 2.0.0 sie gleich sind:

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