🤖

【Ruby 3.4 Advent Calender】添字アクセスの代入式でブロック引数が渡せなくなった【4日目】

2024/12/04に公開

Ruby 3.4 Advent Calender 4日目の記事です。

これはなに

今年 2024年12月25日にリリースされる予定の Ruby 3.4 の新機能や変更点などを1つずつ紹介していく Advent Calender になります。
基本的には NEWS に載っている機能を紹介すると思うんですがここにない機能についても書くかもしれません。
また、記事を書いてる時点ではまだ Ruby 3.4 はリリースされる前なので Ruby 3.4 がリリースされた時点で機能が変わっている 可能性があるかもしれないので注意してください。
記事のまとめは ここを参照 してください。

添字アクセスの代入式ででブロック引数が渡せなくなった

Ruby 3.4 からは添字アクセスの代入式(#[]=)でブロック引数が渡せなくなりました。
なんのこっちゃ、と思うんですがその言葉通りで次のようなコードは Ruby 3.4 からはシンタックスエラーになります。

# error: block arg given in index assignment (SyntaxError)
a[1, &b] = 42

元々は prism でのこの構文の対応をどうするのかの話からはじまったんですが最終的には Ruby の構文自体で禁止するようになった経緯です。
ちなみに禁止されたのは #[]= になり #[] は引き続きブロック引数を渡すことは可能です。

class X
  def [](i, &block)
    [i, block]
  end
end

# #[] にブロック引数を渡すことはできる
pp X.new[1, &:hoge]
# => [1, #<Proc:0x000075c65eb13f10(&:hoge) (lambda)>]

pp X.new[1] { |a, b| }
# => [1, #<Proc:0x000075c65eb13f10(&:hoge) (lambda)>]

非互換な変更になるのでもし使用しているコードがある場合は注意する必要があります。

関連

GitHubで編集を提案

Discussion