BLOG

ブログ

2022/11/28 技術系

【Ruby】Enumerableモジュールのany?メソッドについて

この記事を書いた人 M.B

はじめに

ある条件を満たす値が配列にあるかどうかを判定したいと思った時に、any?メソッドを使って実現できることについてまとめます。

やりたいこと

やりたいことは以下の2つです。

  • ある条件を満たす値が配列に存在する/しないを判定する
  • 1つでも見つかればそこで判定を終了する

any?メソッドとは

any?メソッドは、Enumerableモジュールが提供するメソッドの一つです。
Enumerableとは「数え上げられる」「列挙可能な」といった意味です。

どのようなメソッドかというと…

すべての要素が偽である場合に false を返します。真である要素があれば、ただちに true を返します。

ブロックを伴う場合は、各要素に対してブロックを評価し、すべての結果が偽である場合に false を返します。ブロックが真を返した時点で、ただちに true を返します。

https://docs.ruby-lang.org/ja/latest/method/Array/i/any=3f.html

試してみる

any?を使わない書き方と、any?を使った書き方ではどのように違うのか、「グループに30歳以上の人がいるかどうか」を例に試してみます。

any?を使わない時

eachメソッドを使います。

# 30歳以上が存在する
ages_1 = [21, 25, 28, 33, 45, 26]
# 30歳以上が存在しない
ages_2 = [28, 21, 24, 25, 22, 23]

bool_1 = false
ages_1.each do |age|
  bool_1 = age >= 30
  break if bool_1
end
p bool_1
#=> true

bool_2 = false
ages_2.each do |age|
  bool_2 = age >= 30
  break if bool_2
end
p bool_2
#=> false

any?を使った時

# 30歳以上が存在する
ages_1 = [21, 25, 28, 33, 45, 26]
# 30歳以上が存在しない
ages_2 = [28, 21, 24, 25, 22, 23]

p ages_1.any? { |age| age >= 30 }
#=> true

p ages_2.any? { |age| age >= 30 }
#=> false

まとめ

any?メソッドを使うとスッキリと簡潔になり、文章を読み下すような感覚で直感的に読めると感じます。
真である要素があれば、ただちに true を返すため、eachで書いた場合に使ったbreakのことを気にしなくてよくなるのもいいなと思いました。

Enumerableモジュールには他にもまだまだ便利なメソッドが用意されていますので、適宜適切なメソッドを使いこなしていきたいです!



株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!

アーカイブ