トップ «前の日記(2022-11-12 (Sat)) 最新 次の日記(2022-12-05 (Mon))» 編集   RSS 1.0 FEED  

Journal InTime


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でも使えるので、全部使えるようにした方が互換性の面ではよさそう。

Tags: Ruby