RubyのNumbered parameterについて調べたこと

開発
この記事を書いた人
井上 周

WEBのバックエンドエンジニア。金沢大学大学院→株式会社マイベスト。
最も得意な言語はRuby(Rails)。その他、GoやPython、TypeScriptsを使った開発を行っています。

井上 周をフォローする

ある日、レビューしていたRuby on Railsのコードの中で下記のような実装がありまして、所見で何をしているのかわからなかったので調べたことのメモ書きです。

product_shop_attributes.each { product.product_shops.build(_1) }

通称「なんぱら」とも言われるこちらの書き方はNumbered parameterという書き方で、Rubyの2.7から導入された機能のようです。

RubyのNumbered parameter

Numbered parameterとはブロックの仮引数を省略して、「_」を数字のprefixとした変数で受け取ることができる記法になります。

通常、ブロックの内部で|num|のような形で| |を書くことでその処理に使う値を扱います。

[1] pry(main)> (1..10).map { |num| num * 10 }
=> [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

しかし、Numbered parameterを使うことでこの| |を省略した形で仮引数を扱うことができるようになります。

[2] pry(main)> (1..10).map { _1 * 10 }
=> [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

もしも仮引数を複数扱いたい場合も、以下のように書くことができそうです。

[4] pry(main)> (1..10).map.with_index { { _2 => _1 * 10} }
=> [{0=>10}, {1=>20}, {2=>30}, {3=>40}, {4=>50}, {5=>60}, {6=>70}, {7=>80}, {8=>90}, {9=>100}]

参考

ピュア Ruby で Ruby 2.7 の Numbered parameter を実装してみよう! - Qiita
Ruby Advent Calendar 2019 1日目の記事になります。 本記事では Ruby 2.7 で実装される Numbered parameter っぽい機能をピュアRuby で実装してみたいと思います。 またこの記事の実...
Rubyのブロック、ブロック引数、Proc、yieldをまとめてみた | Ruby on Rails 始めました
Rubyのブロック、ブロック引数、Proc、yieldっていうJavaには無い機能についてだいたい分かったので、忘備録としてまとめました。ブロックとは Rubyではdo ~ endの一塊(処理の塊)を

コメント

タイトルとURLをコピーしました