Select と Reject
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 21/56。
select メソッドは、ブロックが真(truthy)な値を返す要素のみを含む新しい配列を返します。これは Ruby における「filter」の書き方です。
numbers = [1, 2, 3, 4, 5, 6]
evens = numbers.select { |n| n.even? }
puts evens.inspect # [2, 4, 6]reject はその逆で、ブロックが false を返すものをすべて保持します:
odds = numbers.reject { |n| n.even? }
puts odds.inspect # [1, 3, 5]両方とも新しい配列を返します。元の配列は変更されません。
ブロックは単なる述語であり、true または false と評価されるものであれば何でも機能します:
words = ["hi", "hello", "hey", "yo"]
long = words.select { |w| w.length >= 3 }
puts long.inspect # ["hello", "hey"]チャレンジ
初心者カンマ区切りの整数のリストを読み込みます。次の2行を出力してください:
10より大きい数値(selectを使用)、", "で連結したもの3で割り切れない数値(rejectを使用)、", "で連結したもの
入力が 3,7,12,15,20 の場合、出力は次のようになります:
12, 15, 20
7, 20チートシート
select は、ブロックが真(truthy)を返す要素を持つ新しい配列を返します("filter" のような動作です):
evens = [1,2,3,4].select { |n| n.even? } # [2, 4]reject はその逆で、ブロックが偽(falsy)を返す要素を保持します:
odds = [1,2,3,4].reject { |n| n.even? } # [1, 3]どちらも新しい配列を返します。元の配列は変更されません。
自分で試してみよう
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: 1行目、10より大きい数値、", "で結合
# TODO: 2行目、3で割り切れない数値、", "で結合
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
5Enumerable の強力な機能
Select と RejectMap のメソッドチェーンReduce / Injectcount, all?, any?, none?group_by と partitionsort_by, min_by, max_byまとめ:データパイプライン