【Ruby 3.0 Advent Calendar 2020】Arguments forwardingがちょっと便利になった【10日目】

はじめに

Ruby 3.0 Advent Calendar 2020 10日目の記事になります。

昨日は、【Ruby 3.0 Advent Calendar 2020】Ruby 3.0.0-preview2 がリリースされた【9日目】です。

secret-garden.hatenablog.com

今日は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

再帰させて引数を一つづつ出力することが簡単に書けます。

再帰周りとかのコードは書きやすそうなので重宝しそうですね。

参考

github.com

bugs.ruby-lang.org

koic.hatenablog.com