hypermkt blog

最近出会ったRubyの便利メソッド復習

April 01, 2021

はじめに

開発の過程やコードレビューで便利メソッドに出会ったので、次回からすぐに使えるように備忘録としてまとめておく。

ActiveSupport の try

nil でない時に何かしたいときに便利

そういうとき、よくありますよね。

name = nil
p name.upcase if name.present?

そんな時にはActiveSupport の try が便利だった。ちょっとした処理でもスマートにかけるのいいですねー。

name = nil
name.try(:upcase)

# ブロックを渡すことできる
name.try { |v| v.upcase }

Enumerable#group_by

仕分けにはgroup_byは便利

例えば people という人の集まりの配列があり、大人と子供で仕分けしたいとする。そんな時には Enumerable#group_by がめっちゃ便利だった。

ポイントとしてはブロックで評価した結果をキーとしてハッシュにセットされるので、そこは好きなものをセットするのが良さそう。

people = [
  { name: 'Max', age: 30 },
  { name: 'John', age: 20 },
  { name: 'Michael', age: 10 },
]
result = people.group_by do |v|
  if v[:age] >= 20
    :adult
  else
    :child
  end
end

p result

いやー、これは便利だわ。

$ ruby group_by.rb
{:adult=>[{:name=>"Max", :age=>30}, {:name=>"John", :age=>20}], :child=>[{:name=>"Michael", :age=>10}]}

Array#sort

データベースからデータを取得する場合は order by をすればいいが、API のレスポンスやCSVデータを任意の条件で並び替えたい時に Array#sort が便利だった

対象の配列に対して比較条件をブロックで渡すだけでOK。いやぁ、知らなかったなー。

people = [
  { name: 'Max', age: 10 },
  { name: 'John', age: 30 },
  { name: 'Michael', age: 20 },
]

# age の昇順に並び替え
p people.sort { |a, b| a[:age] <=> b[:age] }
# => [{:name=>"Max", :age=>10}, {:name=>"Michael", :age=>20}, {:name=>"John", :age=>30}]

# b, a を入れ替えることで age の降順に並び替え
p people.sort { |a, b| b[:age] <=> a[:age] }
# => [{:name=>"John", :age=>30}, {:name=>"Michael", :age=>20}, {:name=>"Max", :age=>10}]

ポイントは <=> 演算子による数値の比較。a, b をそのまま比較すれば昇順となるので、b, a で比較すれば降順となる。なるほどなぁ〜。

[1] pry(main)> 100 <=> 200
=> -1
[2] pry(main)> 200 <=> 100
=> 1
[3] pry(main)> 100 <=> 100
=> 0

Enumerable#sort_by

sort_by というのもあるんですねぇ。

  • ブロックの評価結果を <=> メソッドで比較することで、self を昇順にソートします

なるほどー。 パフォーマンス的にも sort よりも優れていると能登なので、基本的にはこちらを使うのが良さそう。

[4] pry(main)> [1, 3, 2, 5].sort_by { |v| v }
=> [1, 2, 3, 5]

以上!

参考


都内で働くWebアプリケーションエンジニア。主にサーバーサイド。最近はRuby/Railsでコードを書くのが楽しい。