Ruby 3.2 アドベントカレンダーの1日目の記事です。
Ruby は毎年クリスマスにバージョンが上がります。 今年も順調にいけば 12/25 に Ruby 3.2 がリリースされるはずです。 3.2 がリリースされるまで毎日少しずつ変更点を見ていきながらリリースを待ちましょう。
ネタ元は Ruby 3.2 preview3 の NEWS.md。
キーワードパラメータその1
*
や **
で受け取ったパラメータを引数として使う場合に変数名をつける必要がなくなった。
def hoge(a, *, **) a #=> 123 fuga(*, **) end def fuga(*args, **opts) pp args, opts #=> [456] # {:x=>"abc", :y=>"def"} end hoge(123, 456, x: 'abc', y: 'def')
でもこれキーワードパラメータがあるとエラーになってしまう。
def hoge(a, *, x: nil, **) fuga(*, **) #=> no anonymous keyword rest parameter end
これはどうやらバグだったらしい。3.2 リリースまでには直りそう。
Bug #19132: **
を引数に指定すると no anonymous keyword rest parameter になる - Ruby master - Ruby Issue Tracking System
キーワードパラメータその2
ブロックパラメータがキーワードパラメータを含む場合に、配列を渡した場合の扱いが変わった。 3.1 までは配列の中の要素が展開されてパラメータに格納されたが、3.2 では配列のまま。
Ruby 3.1:
proc{|a| p a}.call([1, 2]) #=> [1, 2] proc{|a,| p a}.call([1, 2]) #=> 1 proc{|a, k:nil| p a}.call([1, 2]) #=> 1 proc{|a, **k| p a}.call([1, 2]) #=> 1
Ruby 3.2:
proc{|a| p a}.call([1, 2]) #=> [1, 2] proc{|a,| p a}.call([1, 2]) #=> 1 proc{|a, k:nil| p a}.call([1, 2]) #=> [1, 2] proc{|a, **k| p a}.call([1, 2]) #=> [1, 2]