【一人 bugs.ruby Advent Calendar 2021】[Bug #17719] Irregular evaluation order in hash literals【20日目】

一人 bugs.ruby Advent Calendar 2021 20日目の記事になります。
今日は Hash リテラルでキーが重複したときの話です。

[Bug #17719] Irregular evaluation order in hash literals

Hash リテラルでキーが重複している場合に以下のような評価順になります。

# 1個目と2個目の foo の要素が先に評価される
$ ruby -e '{ foo: p(1), bar: p(2), foo: p(3) }'
-e:1: warning: key :foo is duplicated and overwritten on line 1
1
3
2

上記の場合だと左から順に評価されるのではなくて先に foo のキーの値が評価される形になっています。
これはバグだったようで重複するキーがあっても左から順に評価されるように以下のように修正されました。

ary = []
{ a: ary << 1, b: ary << 2, a: ary << 3 }
pp ary
# Ruby 3.0 => [1, 3, 2]
# Ruby 3.1 => [1, 2, 3]

以下のような問題もあるしもうエラーにしちゃっていいんじゃないかなあ…と思わなくもない。