Rails歴の長い先輩方は配列メソッドの使い方がうまいなと日々思うので、基本的な使い方だけまとめてみました。
①&:(メソッドをブロックとして渡す)
# ex. 整数→文字列に変換
numbers = [1, 2, 3, 4, 5, 6]
numbers.map(&:to_s)
> ["1", "2", "3", "4", "5", "6"]
→enumメソッド
やRailsの組み込みメソッド
でよく使います!
②ブロックの利用(ワンライナー)
numbers = [1, 2, 3, 4, 5, 6]
numbers.map { |n| n.to_s }
> ["1", "2", "3", "4", "5", "6"]
③ブロックの利用(do~end)
numbers = [1, 2, 3, 4, 5, 6]
numbers.map do |n|
n.to_s
end
> ["1", "2", "3", "4", "5", "6"]
使い分け
僕は以下のように使い分けていました。
用途 | ||
---|---|---|
A | ①(&:) | メソッド一つで処理がすむ |
B | ②({}) | ①では対応できないが、ワンライナーでいけるくらいの長さ、または続けて配列処理したい場合 |
C | ③(do~end) | 処理が複雑 |
いくつか例にとってパターン分けしてみます!
(例1) 複数回にわけて、メソッド処理したい
numbers = [1, 2, 3, 4, 5, 6]
numbers.map(&:to_s).select { |n| n == '2' }
> ["2"]
Bパターンですね!
(例2) ワンライナーではすまない複雑な処理
numbers = [1, 2, 3, 4, 5, 6]
even_num = [2, 4, 6]
numbers.each do |n|
if even_num.include?(n)
p '偶数'
else
p '奇数'
end
end
> '奇数'
> '偶数'
> '奇数'
> '偶数'
> '奇数'
> '偶数'
Cパターンですね!
ワンライナーではすまない & 追加で配列加工したい
today = Date.today
two_months_later = today.next_month.next_month
mondays = (today..two_months_later).map { |date|
if date.monday?
"#{I18n.l(date)}の月曜日です"
end
}.compact
> ["2019/08/19の月曜日です", "2019/08/26の月曜日です", "2019/09/02の月曜日です", "2019/09/09の月曜日です", "2019/09/16の月曜日です", "2019/09/23の月曜日です", "2019/09/30の月曜日です", "2019/10/07の月曜日です", "2019/10/14の月曜日です"]
Bパターンですね!(ワンライナーでかけそうでごめんなさい)