💭

[Feature #20211] Ruby 3.4 でブロックの引数の匿名引数をフォワードできるようにする提案

2024/03/28に公開

[Feature #20211] Consider re-adding 3.2-style support of Anonymous Args/Blocks

def m(*)
  [1, 2, 3].each { |*| p(*) }
end
m('test', 'test', 'test')
# Ruby 3.2 => p('test', 'test', 'test') が呼ばれる
# Ruby 3.3 => error: anonymous rest parameter is also used within block (SyntaxError)
def m(*)
  [1, 2, 3].each { p(*) }
end
m('test', 'test', 'test')
# Ruby 3.2 => p('test', 'test', 'test') が呼ばれる
# Ruby 3.3 => p('test', 'test', 'test') が呼ばれる
# Ruby 3.4 => p('test', 'test', 'test') が呼ばれる

def m(*)
  # このときにブロック引数の * を優先する
  [1, 2, 3].each { |*| p(*) }
end
m('test', 'test', 'test')
# Ruby 3.2 => p('test', 'test', 'test') が呼ばれる
# Ruby 3.3 => error: anonymous rest parameter is also used within block (SyntaxError)
# Ruby 3.4 => p(1) p(2) p(3) が呼ばれる
  • 個人的にはこっちの方が期待する挙動としては自然な気がしますねー
GitHubで編集を提案

Discussion