😸

【Ruby 3.4 Advent Calender】添字アクセスの代入式でキーワード引数が渡せなくなった【5日目】

2024/12/05に公開

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

これはなに

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

添字アクセスの代入式でキーワード引数が渡せなくなった

昨日の Advent Calender の内容と似ているんですが Ruby 3.4 からは添字アクセスの代入式([]=)でキーワード引数が渡せなくなりました。

次のようなコードは Ruby 3.4 からはシンタックスエラーになります。

# error: keyword arg given in index assignment (SyntaxError)
a[1, kwd: 2] = 42

背景

元々は以下のようなコードを Ruby 3.3 で実行すると Ruby がクラッシュするという話からはじまっています。

class X
  def []=(*args, **kwd)
    pp(args)
    pp(kwd)
  end
end

x = X.new
# 内部で kwd: 2 の部分が渡せずにクラッシュする
x[1, kwd: 2], _ = [3, 4]

これは Ruby 3.2 だと動作していたんですが、そのときには kwd: 2 の部分が位置引数として受け取っていたので動いていたみたいですね。

class X
  def []=(*args, **kwd)
    pp(args)   # => [1, {:kwd=>2}, 3]
    pp(kwd)    # => {}
  end
end

x = X.new
# kwd: 2 は位置引数として X#[]= に渡される
x[1, kwd: 2], _ = [3, 4]

また、これも #[]= が禁止されただけで #[] の方は依然として動作します。

class X
  def [](*args, **kwd)
    pp(args)   # => [1]
    pp(kwd)    # => {kwd: 2}
  end
end

x = X.new
x[1, kwd: 2]

一応非互換な変更にはなるのでご注意を。

関連

GitHubで編集を提案

Discussion