今回はRuby2.7から導入された、ブロックパラメータの宣言を省略できるNumbered parametersについて紹介したいと思います。この記事を書いている2021年末からするとやや古い機能な感じに思われますが、最近使う機会が出てきたため改めて備忘録としてまとめておきます。
Numbered parametersとは
Numbered parameters(略してナンパラ)はRuby2.7から導入された機能で、ブロックパラメータの宣言を省略できる機能になります。
通常、ブロックで引数を受け取る場合はパラメータを定義して受け取らなければなりません。以下はブロックの数字をそれぞれ足した結果を返すプログラムです。
array = [1, 2, 3]
array.map{ |e| e + e }
=> [2, 4, 6]
# 上記は以下のように書くこともできます。
array = [1, 2, 3]
array.map do |e|
e + e
end
=> [2, 4, 6]
上記のブロックパラメータではelementのeを渡していますが、integerのiやnumberのnの方がふさわしい気もします。普段コードを書いていると、このようにブロックパラメータの名前を考える時間が発生します。
ここで使える機能がNumbered parametersになります。
Numbered parametersはブロックパラメータを_1
や_2
として、名前を付けずに参照することができるため、ブロックパラメータの名前をいちいち考える必要がありません。以下は、Numbered parameters(_1)を使用して書き直したプログラムになります。
array = [1, 2, 3]
array.map{ _1 + _1 }
=> [2, 4, 6]
Numbered parametersは以下のようにも使うことができます。
# 配列の各要素に対して処理を行う
array.map(&:downcase)
array.map { _1.downcase }
# 配列の各要素を引数にメソッドを呼び出す
array.map { |i| method_call(i) }
array.map { method_call(_1) }
注意点
Numbered parametersを使用する上で、1点注意しなければならないことがあります。
それはネストされた状態でNumbered parametersは使用できないということです。ネストされた状態で使用してしまうと、エラーが吐き出されてしまうため注意しましょう。
3.times do
_1.times do
p _1
end
end
=> numbered parameter is already used in
メリット
Numbered parametersのメリットとしては以下の3点といった所でしょうか。
- ブロックパラメータをシンプルに書くことができる
- ブロックパラメータの命名で困ることがない
- 記述量が若干減る
3点目のメリット「記述量が若干減る」については、メリットにするべきかどうか迷いましたが、結果的に記述量が減っていることから1メリットとして挙げました。
# 記述量がやや減っている
array.map{ |e| e + e }
array.map{ _1 + _1 }
デメリット
Numbered parametersのデメリットとしては、使用しすぎるとかえって可読性が落ちてしまうということです。1プログラムに複数のNumbered parameters、例えば_1~_9
が並んでしまうと何をしているのか分からなくなってしまいます。
Numbered parametersは単純なコードで_1
のみ使用できるといった感じで、決まり事を定めておくのも1つの手だと思います。
まとめ
- Numbered parametersはRuby2.7から導入された
- Numbered parametersはブロックパラメータの宣言を省略できる機能
- ブロックパラメータをシンプルに記述でき、名前も考える必要がない
- ネストされた状態でNumbered parametersは使用できない
- 使用しすぎると逆に可読性が落ちてしまうため注意が必要
参考
今回はRuby2.7から導入された、ブロックパラメータの宣言を省略できるNumbered parametersについて紹介しました。現プロダクトにNumbered parametersが使えそうな箇所があれば、ぜひ取り入れてみてください。