👌
Ruby 3.1 系の匿名ブロック引数のフォワードでハマった
Ruby 3.1 では以下のように匿名でブロック引数を受け取れるようになりました。
def foo(...)
end
# 名前無しでブロック引数を受け取る事ができる
def hoge(&)
# それを他のメソッドにフォワードできる
foo(&)
end
ブロック引数はだいたい &block
みたな名前で受け取ってそれを別のメソッドにフォワードすることも多いのでそういうケースでは簡略的にかけるようになって便利ですね。
一部のケースでバグがあった
Ruby 3.1 系で以下のように『キーワード引数 + ブロックの匿名引数』で受け取った場合に『匿名のブロック引数をフォワードすると SyntaxError になる』というバグがありました。
def foo(...)
end
def hoge(a:, &)
# error: no anonymous block parameter
foo(&)
end
これは Ruby 3.1.3 で修正されており現在は問題ないんですが、今日思いっきりこのバグを踏んでしまったので記録として残しておきます。
bugs.ruby のバグチケは以下の通り。
Discussion