Ruby 2.7 アドベントカレンダーの9日目の記事です。
「...」で全引数渡し
メソッド内から別のメソッドを呼び出す際に、...
で今のメソッドに渡された引数そのまま渡すことができるようになりました。
ブロックも含めてすべて渡されます。
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
うーん、いまいち使い勝手が悪いような気が…。普通に引数で受けて、...
て全引数を渡すってことができてもいいと思うんですが。