【一人 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 以降でまた挙動が変わるかもしれませんね。