【一人 bugs.ruby Advent Calendar 2021】[Bug #18396] An unexpected "hash value omission" syntax error when without parentheses call expr follows【24日目】

一人 bugs.ruby Advent Calendar 2021 24日目の記事になります。
今日は Ruby 3.1 で入る予定の Hash の値の省略記法で意図しない挙動がある話しです。

[Bug #18396] An unexpected "hash value omission" syntax error when without parentheses call expr follows

Ruby 3.1 では Hash の値の省略記法が新しく入りました。

name = "homu"

# pp(name: name) と同じ意味
pp name:
# => {:name=>"homu"}

これを使った時に次のようなコードで『次の行の式』が値になってしまうというバグ報告です。

name = "homu"

# func(name: name) になってほしいが実際には func(name: 42) となってしまう
pp name:
42
# => {:name=>42}

れ自体は Ruby 3.0 でも以下のように動作するのでこれは仕様との事です。

foo key:
bar

このようなケースでは以下のように明示的に () を付けて回避する必要があります。

name = "homu"

# pp(name: name) と同じ意味
pp(name:)
# => {:name=>"homu"}
42

意図せずうっかり書いちゃいそうなので明示的に () を付けて書くようにするとよさそうですね。
また、この挙動は matz 的には改善したいようなので Ruby 3.1 以降でまた挙動が変わるかもしれませんね。