A Day in the Life

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

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 の戻り値の順序が一定だ、と書いていたテストがこけるようになった。(そもそも順序が一定前提のテストが悪いんだけど)

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

*1https://github.com/ruby/ruby/commit/e19bd3eaa8bd71cfc9e5bf436527f015b093f31e

記事の一覧 >