言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. 配列.any? / all? / none? / count

配列.any? / all? / none? / count

対応: Ruby 1.8(2003)

配列の要素が条件を満たすかどうかを判定したり、条件に一致する要素の数を数えたりするメソッドです。

構文

# 1つ以上の要素が条件を満たせば true を返します。
配列.any? { |要素| 条件式 }
配列.any?  # 要素が1つ以上あれば true

# すべての要素が条件を満たせば true を返します。
配列.all? { |要素| 条件式 }
配列.all?  # nil と false 以外の要素のみなら true

# 条件を満たす要素が1つもなければ true を返します。
配列.none? { |要素| 条件式 }

# 条件に一致する要素の数を返します。
配列.count
配列.count(値)
配列.count { |要素| 条件式 }

メソッド一覧

メソッド概要
any?ブロックありの場合、1つでも条件を満たす要素があれば『true』を返します。ブロックなしの場合、配列が空でなければ『true』を返します。
all?ブロックありの場合、すべての要素が条件を満たせば『true』を返します。空配列に対しては常に『true』を返します。
none?条件を満たす要素が1つもない場合に『true』を返します。
count引数・ブロックなしの場合は要素数を返します。値またはブロックを渡すと一致した要素の数を返します。

サンプルコード

sample_array_any_all_none_count.rb
scores = [65, 82, 91, 78, 55]

# any? で1つでも条件を満たすか確認します。
puts scores.any? { |s| s >= 90 }   # true(91がある)
puts scores.any? { |s| s >= 100 }  # false

# all? ですべての要素が条件を満たすか確認します。
puts scores.all? { |s| s >= 50 }   # true(全員50以上)
puts scores.all? { |s| s >= 80 }   # false

# none? で条件を満たす要素が1つもないか確認します。
puts scores.none? { |s| s < 50 }   # true(50未満はいない)
puts scores.none? { |s| s > 90 }   # false(91がある)

# count で要素数を数えます。
puts scores.count            # 5(全要素数)
puts scores.count(82)        # 1(値が82の要素数)
puts scores.count { |s| s >= 80 }  # 2(80以上の要素数)

# 実用例: バリデーションチェックです。
mail_list = ["a@example.com", "b@example.com", "invalid-email"]
all_valid = mail_list.all? { |m| m.include?("@") }
puts all_valid  # false

invalid_count = mail_list.count { |m| !m.include?("@") }
puts "無効なメール: #{invalid_count}件"  # 無効なメール: 1件
ruby array_any_all_none_count.rb
true
false
true
false
true
false
5
1
2
false
無効なメール: 1件

概要

これらのメソッドは配列全体に対する条件判定を簡潔に書けます。『each』ループとフラグ変数を使う書き方より可読性が高くなります。

『all?』は空配列に対して常に『true』を返します(数学的な「全称命題が空集合で真」という考え方に基づきます)。空配列に対する動作が重要な場合は事前に『empty?』を確認してください。

条件に一致する要素を取り出すには『select / reject』を、要素の存在確認だけであれば『include?』も使用できます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。