2022-11-18 (Fri) [長年日記]
_ anonymous keyword rest parameterのバグ修正
とみたさんから報告があったanonymous keyword rest parameterのバグを修正した。 Ruby 3.2で
def foo(**)
bar(**)
end
のように匿名でキーワード引数を他のメソッドに転送する機能が追加されたが、
def foo(x: 1, **)
bar(**)
end
のようにキーワード引数を一部だけ転送する場合に文法エラーになるというもの。
修正自体はごく短いが、修正したらRubyVM::AbstractSyntaxTreeの動作が変わってしまったりしてあるべき動作を確認するのが大変だった。
調査の過程で動作に疑問がある部分があったので別のissueを作成しておいた。
def foo(...)
bar(*) # OK
baz(&) # OK
quux(**) # NG
end
上記のように ...
を使った時に *
と &
は使えるが、 **
は使えない、というもの。
全部使えるか、全部使えない、のどちらかがよいように思うが、 &
はRuby 3.1でも使えるので、全部使えるようにした方が互換性の面ではよさそう。