0
0

More than 1 year has passed since last update.

Ruby で Array や Hash のメソッドを使いこなしたい

Last updated at Posted at 2022-04-06

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 でループ書く時は、既存のメソッドでできないか調べるべし!

リファレンスマニュアル

ここにあるメソッドをサラッと使えると生産性が上がるはず。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0