Ruby には、多くのメソッドが用意されています。
私もそうでしたが、他の言語は知っていて Ruby を知らない場合、Ruby のメソッドを使いこなせていないことがあります。
他言語経験者が、知っておくべき Ruby の Array, Hash のメソッドをユースケース毎に書きたいと思います。
特定の要素を取得する (Enumerable#find)
特定の条件を満たす要素を取得する場合、
ループと if 文を駆使して探すことを考えるかもしれませんが、
tasks.each do |task|
next unless task[:state] == 'finished'
found = task
break
end
find
一行で取れます。
found = tasks.find { |task| task[:state] == 'finished' }
特定の要素を削除する (Hash#delete_if)
特定の条件を満たす要素を削除する場合、、、(以下略
schedules.each do |key, schedule|
schedules.delete(key) if schedule.empty?
end
delete_if
一行で削除できます。
schedules.delete_if { |_key, schedule| schedule.empty? }
注意
delete_if
は元の Hash から要素を削除します。
元の Hash を変更したくない場合は reject
を使います。
要素内の値を取り出して新たな Array を作る (Array#map)
Array の要素が Hash になっていて、その Hash の一要素だけの Array を作る場合、、、(以下略
start_times = []
schedules.each do |schedule|
start_times.push(schedule[:start_at])
end
map
一行でできます。
start_times = schedules.map(&:start_at)
特定の要素を削除した新たな Array を作る (Enumerable#each_with_object)
Array の要素が Hash になっていて、その Hash の一要素だけの Array を作りたいけど、その Array に入れる条件もある場合、、、(以下略
start_times = []
schedules.each do |schedule|
unless schedule[:status] != 'finished'
start_times.push(schedule[:start_at])
end
end
一行ではありませんが、each_with_object
でスッキリ書けます。
start_times = schedules.each_with_object([]) do |schedule, result|
result << schedule[:start_at] unless schedule[:status] == 'finished'
end
結論
Ruby でループ書く時は、既存のメソッドでできないか調べるべし!
リファレンスマニュアル
ここにあるメソッドをサラッと使えると生産性が上がるはず。