Help us understand the problem. What is going on with this article?

Rubyの便利なメソッドたち

More than 1 year has passed since last update.

かれこれ10ヶ月ほどお仕事でRubyを使っており、すっかりRubyの書きやすさに惚れ込んでいます。
Rubyの良いところは、処理の実現方法が多様である点(同じことを実現する上で色々な方法がある)だと思っています。

今回はこの10ヶ月の中で特にお世話になった便利なRubyのメソッドをご紹介します。

Hash

dig

ネストされている連想配列からkeyに該当するvalueを取得します。
Railsとかでよく params[:user][:personal_info][:addresses] と書くのを楽にしてくれます。

hash_dig.rb
h = { foo: {bar: {baz: 1}}}
h.dig(:foo, :bar, :baz)
# => 1

存在しないkeyを指定した場合にはnilが返されます。

hash_dig_2.rb
h = { foo: {bar: {baz: 1}}}
h.dig(:foo, :bar, :fizz)
# => nil

fetch

ハッシュから指定したKeyに該当するValueを返します。
キーが存在しない場合にはエラーを返しますが、第二引数を与えてやるとKeyが存在しない場合にはValueのデフォルト値としてそちらを使います。

fetch.rb
rankings = { "JavaScript" => 1, "Python" => 2, "Go" => 5, "Java" => 3 }
puts rankings.fetch("Python")
# => 2

p rankings.fetch("COBOL", :out_of_ranking)
# => :out_of_ranking

dig

ネスとされている配列から任意のindexを指定して、それに該当する値を取得します。

array_dig.rb
a = [[1, [2, 3]]]
# 1番目の配列の中の2番目の配列の中の2番目の値
a.dig(0, 1, 1)
# => 3

Hash#digと同様に存在しないものを指定するとnilが返されます。

array_dig_2.rb
a.dig(1, 2, 3)
# => nil

Array

compact

配列からnilを削除して新しい配列を返します。

compact.rb
browsers = ["Safari", "Chrome", nil, "Opera"]
p browsers.compact
# => ["Safari", "Chrome", "Opera"]

uniq

配列から重複する要素を削除した上で新しい配列を返します。

uniq.rb
laptops = ["Mac", "Windows", "ThinkPad", "Windows", "Let's note"]
p laptops.uniq
# => => ["Mac", "Windows", "ThinkPad", "Let's note"]

flatten

ネストされた配列を一次元の配列にした新しい配列を返します。

flatten.rb
languages = ["swift", "Kotlin", ["Python", "Ruby", ["Rust", "Go"]]]
p languages.flatten
# => ["swift", "Kotlin", "Python", "Ruby", "Rust", "Go"]

select

配列から条件に合う要素を取得し、新しい配列として返します。

select.rb
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
p numbers.select {|item| item % 2 == 0 }
# => [2, 4, 6, 8]

reject

配列から条件に合う要素を削除し、新しい配列として返します。

reject.rb
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
p numbers.reject {|item| item % 3 == 0 }
# => [1, 2, 4, 5, 7, 8]

sum

配列内の要素の合計を返します。

sum.rb
[1, 2, 3, 4].sum
# => 10

配列がからの場合には0が返されます。

sum_2.rb
[].sum
# => 0

配列内の足し算をする場合には、Enumerable#injectもあるのですが、sumの方が直感的に書けるのと、小数点を扱う際に誤差を丸めてくれるので、sumの方が好きです。

inject.rb
[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1].inject(:+)
# => 0.9999999999999999
sum_3.rb
[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1].sum
# => 1.0

*ちなみに、文字列の配列に対しても操作できますが、その場合にはArray#joinArray#flattenの方が高速らしいです。

Enumerable

any?

ブロック引数に合致する要素が一つでもある場合にはtrueを、そうでない場合にはfalseを返します。

any.rb
vendors = ["AWS", "GCP", "AZURE"]
vendors.any?{ |v| v.length > 4 }
# => true

all?

全ての要素がブロック引数に合致する場合にはtrueを、そうでない場合にはfalseを返します。

any.rb
vendors = ["AWS", "GCP", "AZURE"]
vendors.all?{ |v| v.length > 4 }
# => false

between?

レシーバーが引数の第一引数(最小値)と第二引数(最大値)の間に含まれて入ればtrue、そうでない場合にはfalseを返します。

between.rb
10.between?(1, 11)
# => true

その他

メソッドではないのですが、Ruby 2.3.0より safe navigation operator (ぼっち演算子) が追加されました。
object&.method と記載でき、 objectがnilの場合には、NoMethodErrorではなくnilを返します
これにより、スクリプト言語で多発するNoMethodErrorに対してより簡単に対処できるようになります。
*あくまでもエラー回避のための演算子であり、根本問題の対応(なぜnilが渡されているのか)はエンジニアがきちんと向き合わなくてはならないことだとは思います。

ruby.safe_navigation_op.rb
10&.to_s
# => "10"

nil&.to_s
# => nil

参考

[Ruby] 便利な組み込みクラスのメソッド達(Enumerable編)
知って得する!55のRubyのトリビアな記法
Ruby の &. と #try の違い

合わせて読みたい

Railsの便利なメソッドたち

yu-croco
backendエンジニアです。仕事ではAWS, Scala on DDDが中心で、たまにRaspberry Piも触ります。発信内容は個人の見解です。
koska
原価計算をテクノロジーで刷新する
https://www.koska.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした