Ruby 2.7 の変更点 - 「...」で全引数渡し

Ruby 2.7 アドベントカレンダーの9日目の記事です。

qiita.com

「...」で全引数渡し

メソッド内から別のメソッドを呼び出す際に、... で今のメソッドに渡された引数そのまま渡すことができるようになりました。 ブロックも含めてすべて渡されます。

def hoge(...)
  fuga(...)
end

def fuga(a, b=0, key: 123, &block)
  p [a, b, key, block]
end

hoge(1)               #=> [1, 0, 123, nil]
hoge(1, 2, key: 789)  #=> [1, 2, 789, nil]
hoge(1) { nil }       #=> [1, 0, 123, #<Proc:0x0000559166565430 test.rb:11>]

括弧なしの super みたいな感じですね。

なお、... はそのままでは Range リテラルと見なされるため、呼び出し時には括弧が必要です。

def hoge(...)
  fuga ...  #=> warning: ... at EOL, should be parenthesized?
end

また、... で呼び出す側のメソッドの定義時の引数も ... でないといけません。

def hoge(a, b)
  fuga(...)    #=> unexpected ...
end

うーん、いまいち使い勝手が悪いような気が…。普通に引数で受けて、... て全引数を渡すってことができてもいいと思うんですが。