【Ruby】mapメソッドと&とシンボルを使ってリファクタリングしてみた!
標準入力される整数 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回呼び出す以外の処理がない
まとめ
繰り返し処理をやるときはeachを使いがちだけど、ループした結果を空の配列に入れるような処理はmapメソッドを使うことで簡潔に書ける。
参考
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで 伊藤 淳一 技術評論社 2017-11-25 p96〜P99