ポイント
空の配列を用意して、他の配列をループ処理した結果を空の配列に詰め込んでくような処理の大半は、mapメソッドに置き換えることができる。
例
def to_ints(hex)
r, g, b = hex[1..2], hex[3..4], hex[5..6]
ints = []
[r, g, b].each do |s|
ints << s.hex
end
ints
end
# to_ints('#000000')
# => [0, 0, 0]
# to_ints('#ffffff')
# => [255, 255, 255]
上のコードの処理は、
・引数の文字列から3つの16進数を抜き出し、
・3つの16進数を配列に入れ、ループを回しながら10進数の整数に変換した値を別の配列に詰め込み、
・10進数の整数が入った配列を返す。
という処理を行っています。
ここで冒頭のポイントの通り、
「空の配列を用意して、他の配列をループ処理した結果を空の配列に詰め込んでくような処理の大半は、mapメソッドに置き換えることができる。」
ので、以下のようにmapメソッドに置き換えられます。
def to_ints(hex)
r, g, b = hex[1..2], hex[3..4], hex[5..6]
[r, g, b].map do |s|
s.hex
end
end
mapメソッドはブロックの戻り値を配列の要素にして新しい配列を返すメソッドなので、
リファクタリング前のコードのように、変数を用意しなくとも、
mapメソッドとブロックだけで処理を完結できます。
参考文献
伊藤 淳一 「プロを目指す人のためのRuby入門」, 技術評論社, 2017