【Ruby】mapメソッドと&とシンボルを使ってリファクタリングしてみた!

f:id:haru89:20200412235246p:plain:w200

標準入力される整数 3, 100(この順で半角スペース区切り)の値を、int型にしてそれぞれの変数に代入する!

やることはこれだけですが、リファクタリングする前と後でコードが見違えた。

リファクタリングする前

input_value = gets.split(' ')
value1 = input_value[0].to_i
value2 = input_value[1].to_i
p input_value # => ["3", "100"]
p value1 # => 3
p value2 # => 100

to_iを2回やってるのことにやや冗長さを感じる

mapメソッドでまとめてto_i

input_value = gets.split(' ').map{ |n| n.to_i }
value1 = input_value[0]
value2 = input_value[1]
p input_value # => [3, 100]
p value1 # => 3
p value2 # => 100

ちなみに以下のようにmapメソッドを使わずにやるとエラーが出ます

input_value = gets.split(' ').to_i
undefined method `to_i' for ["3", "100"]:Array (NoMethodError)

&とシンボルを使ってさらに簡潔に!

input_value = gets.split(' ').map(&:to_i)
value1 = input_value[0]
value2 = input_value[1]
p input_value # => [3, 100]
p value1 # => 3
p value2 # => 100
ただし&とシンボルを使ったこの記法は、次の条件を満たしている必要があります
  1. ブロックの引数が1つ
  2. ブロックの中で呼び出すメソッドには引数がない
  3. ブロックの中では、ブロック引数に対してメソッドを1回呼び出す以外の処理がない

まとめ

繰り返し処理をやるときはeachを使いがちだけど、ループした結果を空の配列に入れるような処理はmapメソッドを使うことで簡潔に書ける。

参考

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発デバッグ技法まで 伊藤 淳一 技術評論社 2017-11-25 p96〜P99