はじめに
Ruby 3.0 Advent Calendar 2020 10日目の記事になります。
昨日は、【Ruby 3.0 Advent Calendar 2020】Ruby 3.0.0-preview2 がリリースされた【9日目】です。
今日はRuby 3.0で入ったArguments forwardingの変更について解説します。
Arguments forwardingって?
Arguments forwarding
とはRuby 2.7で入った機能で、メソッドに渡された引数をそのままフォワード(転送)するというものです。
def hoge(arg) puts "arg is #{arg}" end def foo(...) hoge(...) end foo(1)
上記のようにメソッドfoo
に渡された引数をそのままメソッドhoge
に渡すことができます。
ちなみに、今回の例では引数を一つだけ渡していますが、複数の引数を以下のように渡すこともできます。
def hoge(arg1, arg2) puts "arg1 is #{arg1}" puts "arg2 is #{arg2}" end def foo(...) hoge(...) end foo(1, 2) # => arg1 is 1 # => arg2 is 2
Ruby 3.0で入った変更
以下のようにフォワード(転送)された引数の最初の引数を受け取ることができます。
def hoge(arg1, arg2) puts "arg1 is #{arg1}" puts "arg2 is #{arg2}" end def foo(first, ...) puts "first is #{first}" hoge(...) end foo(1, 2, 3) # => first is 1 # => arg1 is 2 # => arg2 is 3
引数をそのまま渡したいが、引数の最初だけ特定のメソッドに渡したいケースなどで重宝しそうです。
ちなみに、この機能を使うと以下のようなコードが簡単に書けます。
def arg_forward(arg, ...) puts arg arg_forward(...) rescue => e puts :finish end arg_forward(1, 2, 3) # => 1 # => 2 # => 3 # => finish
再帰させて引数を一つづつ出力することが簡単に書けます。
再帰周りとかのコードは書きやすそうなので重宝しそうですね。