👌

Ruby 3.1 系の匿名ブロック引数のフォワードでハマった

2024/03/07に公開

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 のバグチケは以下の通り。

GitHubで編集を提案

Discussion