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? は最初に失敗した時点で停止します。コストが低い処理です。
チャレンジ
簡単カンマ区切りのテスト scores のリスト(整数)を読み取ります。クラスが有効な合格クラスとなる条件は次のとおりです:
- scores の
none?が負ではない(未記録のテストがない) - すべての
all?scores が最大でも100である any?score がちょうど100である(満点が少なくとも1つある)- 少なくとも3つの scores が
>= 70である(countを使用)
ちょうど1行を出力します:
- 4つの条件をすべて満たす場合は
Valid: <count> passing(countは>= 70の scores の個数) - それ以外の場合は
Invalid
入力が 72,80,100,65,90 の場合:4つの scores が >= 70、負の値はなく、すべて <= 100、1つが 100 なので、出力は Valid: 4 passing です。
72,80,90 の場合:3つが passing ですが満点がないため、Invalid です。
自分で試してみよう
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振り返り - データパイプライン自分で練習してみよう: Rubyオンラインコンパイラ