count, all?, any?, none?
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 24/56。
ループを記述することなく、コレクションに関する質問に答える4つの小さなEnumerableメソッド。
count は、ブロックの条件を満たす要素の数を返します:
[1, 2, 3, 4, 5].count { |n| n.even? } # 2
[1, 2, 3, 4, 5].count # 5 (ブロックなし、合計数)all? は、すべての要素がブロックの条件を満たす場合に true を返します:
[2, 4, 6].all? { |n| n.even? } # true
[2, 4, 7].all? { |n| n.even? } # falseany? は、少なくとも1つが条件を満たす場合に true となります:
[1, 2, 3].any? { |n| n.even? } # true
[1, 3, 5].any? { |n| n.even? } # falsenone? は、いずれも条件を満たさない場合に true となります:
[1, 3, 5].none? { |n| n.even? } # trueこれらのメソッドはショートサーキット(短絡評価)を行います。any? は最初に一致した時点で停止し、all? は最初に失敗した時点で停止します。これらは低コストです。
チャレンジ
簡単カンマ区切りのテストスコア(整数)のリストを読み込みます。以下の条件を満たすとき、そのクラスは有効な合格クラスとなります:
- スコアに負の数(未記録のテスト)が
none?(一つもない) all?(すべての)スコアが100以下であるany?(少なくとも一つの)スコアがちょうど100である(少なくとも1つの満点がある)- 少なくとも3つのスコアが
>= 70である(countを使用)
正確に1行出力してください:
- 4つの条件すべてを満たす場合は
Valid: <count> passing(countは>= 70のスコアの数) - それ以外の場合は
Invalid
入力が72,80,100,65,90の場合:70以上のスコアが4つ、負の数なし、すべて100以下、100が1つあるため、出力はValid: 4 passingとなります。
72,80,90の場合:3つの合格スコアがありますが、満点がないためInvalidとなります。
チートシート
コレクションに関する質問に答える4つのEnumerableメソッド:
count – ブロックを満たす要素の数(ブロックがない場合は全体のサイズ)を返します:
[1, 2, 3, 4, 5].count { |n| n.even? } # 2
[1, 2, 3, 4, 5].count # 5all? – すべての要素がブロックを満たす場合にtrueを返します:
[2, 4, 6].all? { |n| n.even? } # trueany? – 少なくとも1つの要素がブロックを満たす場合にtrueを返します:
[1, 2, 3].any? { |n| n.even? } # truenone? – どの要素もブロックを満たさない場合にtrueを返します:
[1, 3, 5].none? { |n| n.even? } # trueこれらのメソッドはショートサーキット(短絡評価)を行います。any?は最初の合致で停止し、all?は最初の失敗で停止します。
自分で試してみよう
scores = gets.chomp.split(",").map(&:to_i)
# TODO: all?, any?, none?, count を組み合わせて Valid か Invalid かを判定する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
5Enumerable の強力な機能
Select と RejectMap のメソッドチェーンReduce / Injectcount, all?, any?, none?group_by と partitionsort_by, min_by, max_byまとめ:データパイプライン