Hatena::Groupsubtech

#生存戦略 、それは

-> 12 { 01 / 04 }

Ruby 1.8.7 の hashdos 対応による挙動の変更点

19:24 | はてなブックマーク - Ruby 1.8.7 の hashdos 対応による挙動の変更点 - #生存戦略 、それは

Ruby 1.8.7-p356 以前の人は p357 もしくは 1.9 にとっととあげよう、という話しなんだけど p357 にしたら一部テストがこけた。p357 ではハッシュの seed が起動毎に異なる*1ので

for i in {1..10}; do ruby-1.8.7-p357 -e 'p ({"fooooo"=>1,"baaaaar"=>2}).keys'; done
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["baaaaar", "fooooo"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["baaaaar", "fooooo"]
["baaaaar", "fooooo"]
["baaaaar", "fooooo"]

という結果になる。これが以前だと

for i in {1..10}; do ruby-1.8.7-p334 -e 'p ({"fooooo"=>1,"baaaaar"=>2}).keys'; done
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]
["fooooo", "baaaaar"]

なため、Hash#keys の戻り値の順序が一定だ、と書いていたテストがこけるようになった。(そもそも順序が一定前提のテストが悪いんだけど)

うっかりダメな実装してる人はこれで挙動が事なり出したりするんじゃないかなぁ。

toydevtoydev2012/01/05 10:26むしろ 1.8 系で順序の保障がされているバージョンがあったことに驚きです^^;
1.8 系は順序保障なし。1.9 系は順序保障ありだと勝手に思ってました。
順序保障が必要な場合、1.8 でも 1.9 でも動くように Hash ではなく Array(偶数がキー、奇数が値) を使っています。格納数が小さい場合だけですが。

secondlifesecondlife2012/01/05 12:001.8 は順序保証されてないです(そのために ActiveSupport::OrderdHash などがあるので)。
たまたまそういう挙動になっていて、その挙動前提で書かれたコードが問題になるかなぁと。

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