-> 12 { 01 / 04 }
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 の戻り値の順序が一定だ、と書いていたテストがこけるようになった。(そもそも順序が一定前提のテストが悪いんだけど)
うっかりダメな実装してる人はこれで挙動が事なり出したりするんじゃないかなぁ。
トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20120104
1.8 系は順序保障なし。1.9 系は順序保障ありだと勝手に思ってました。
順序保障が必要な場合、1.8 でも 1.9 でも動くように Hash ではなく Array(偶数がキー、奇数が値) を使っています。格納数が小さい場合だけですが。
たまたまそういう挙動になっていて、その挙動前提で書かれたコードが問題になるかなぁと。