Hatena::Groupsubtech

#生存戦略 、それは

-> 10 { 01 / 13 }

Ruby の Object#hash

22:44 | はてなブックマーク - Ruby の Object#hash - #生存戦略 、それは

nil.hash したら 4 だったので調べてみた。

$ ruby --version
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]

puts ObjectSpace._id2ref(0) #=> false
puts ObjectSpace._id2ref(1) #=> 0
puts ObjectSpace._id2ref(2) #=> true
puts ObjectSpace._id2ref(3) #=> 1
puts ObjectSpace._id2ref(4) #=> nil
puts ObjectSpace._id2ref(5) #=> 2
puts ObjectSpace._id2ref(6) #=> foo.rb:8:in `_id2ref': 0x6 is not id value (RangeError)

5まではあり、6,7,8は RangeError で追記・7は3でした

puts ObjectSpace._id2ref(9) #=> 4

になるのが解らない…。

あと jruby 1.4 では結果が違った。

$ jruby --version
jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2010-01-11 6586) (Java HotSpot(TM) Client VM 1.6.0_17) [i386-java]

puts ObjectSpace._id2ref(0) #=> false
puts ObjectSpace._id2ref(1) #=> 0
puts ObjectSpace._id2ref(2) #=> true
puts ObjectSpace._id2ref(3) #=> 1
puts ObjectSpace._id2ref(4) #=> nil
puts ObjectSpace._id2ref(5) #=> 2
puts ObjectSpace._id2ref(6) #=> nil

nunanuna2010/01/14 10:00こんにちは。
Fixnumのobject_idはCRubyの実装上2n+1になっています。
なので、7がRangeErrorということはなくて、手元では
$ ruby -v -e 'p ObjectSpace._id2ref(7)'
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]
3
という感じです。

CRubyの実装については、
http://web.archive.org/web/20060925165802/www.loveruby.net/ja/rhg/book/object.html
の「VALUE埋め込みオブジェクト」あたりを読んでみてください。

secondlifesecondlife2010/01/14 10:44詳細な説明ありがとうございます!
なるほど、6 は Qundef なのですね。その他も VALUE 埋め込みオブジェクトを読んですっきりしました。
また手元でも ObjectSpace._id2ref(7) は 3 でしたすいません…。。

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20100113