Ruby 2.7 で導入された Numbered Parameters を試してみた

1 min読了の目安(約1600字TECH技術記事 2

何でこの記事を書こうと思ったのか

Ruby2.7 系を使っている新しいアプリのソースコードを読んでいたら至る所にこんなのが出てきて 🧐 になりました。

User.all.map { _1[:name] }
# => ["joel", "daniel"]

この謎の _1 は Ruby 2.7 から使えるようになった Numbered Parameters というやつらしいです。
今回はこいつが何者なのかについて調べてみました!!

Numbered Parameters

簡単に言うと、今までブロックの繰り返し処理で使っていた書き方をもっとスッキリ書けるようにした構文です。

今まで、

array = ['hoge', 'fuga', 'gaha']
array.each do |name|
  puts name
end

# => 
# hoge
# fuga
# gaha

Numbered Parameters を使うと、

array = ['hoge', 'fuga', 'gaha']
array.each { puts _1 }

# => 
# hoge
# fuga
# gaha

大分スッキリしました!!
ブロック引数の |name| の部分を削除しているのに同じように動いていることが分かります。

お気づきかと思いますが、この _ の後の数字。これがブロック引数の順番を表しています。

これはインデックス番号と違って0から始まる訳では無いので注意です。

第一引数 => _1
第二引数 => _2

で取得するということです。

なのでハッシュにも便利に使えます。

hash = {:name=>"joel", :email=>"joel@example.com"}
hash.each { puts "#{_1}: #{_2}" }

# =>
# name: joel
# email: joel@example.com

mapeachfind に。。。
Enumerable 系のメソッドは非常に良く使いますよね。

今回の Numbered Parameters はご覧の通り、使用できる場面が非常に多いですし結構好きかもしません。

Railsなら、

users = User.all
# => [{:name=>"joel", :email=>"joel@example.com"}, {:name=>"daniel", :email=>"daniel@example.com"}]

users.map { _1[:name] }
# =>  ["joel", "daniel"]

みたいな感じで使えます。

当然 &: の記法は使えませんのでご注意ください。

array = [{:name=>"joel", :email=>"joel@example.com"}, {:name=>"daniel", :email=>"daniel@example.com"}]
array.map{&:_1[:name]}
# => error!!

感想など

個人的には幅広く使えて、かつスッキリするので好きです。
ただし、単なる数字に置き換わるだけ、自分の頭の中で何がどの順番で引数になっているか把握しないといけません。

ブロック引数を使うなら、 |name, email| とか分かりやすい名前にできるところを、意味が伝わりにくくなる書き方になるかもしれません。
この辺の脳の負荷を嫌う人は割といそうですね😬

機会があれば是非使ってみてください🙋‍♂️