RubyのNumbered parameterについて調べたこと
ある日、レビューしていた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 2.7.0-preview2 で変わる Numbered parameter - SmartHR Tech Blog
お疲れ様です。 SmartHR 社で業務委託を承っております osyo と申します。 業務では主に activerecord-bitemporal の開発・保守を行っております。 前回は Ruby 2.7.0-preview1 Numbered parameters 完全攻略! という記事を書かせていただきました。 さて、先日 Ruby 2.7.0-preview2 がリリースされました。 Ruby 2.7.0-preview1 がリリースされてから約5ヶ月経ち Numbered parameter の仕様に関していろいろと変更点がありました。 そこで今回は preview1 から previ…

ピュア 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の一塊(処理の塊)を
記事の更新をメールで受け取る
質問・リクエストを送る
記事についての質問や、取り上げてほしいテーマがあればお気軽にどうぞ。いただいた質問はブログ記事として回答し、Q&Aページで公開することがあります。