select / find_all の別名・関連
filter
Ruby 2.6 以降で使える select の別名。動作は完全に同じ。
例: ary.filter { |x| x.even? } => ary.select { |x| x.even? }
reject(関連)
条件を満たすものを「除外」する逆操作。戻り値は select と同じ形(配列)だが選ぶ基準が反転する。
例: ary.reject { |x| x.even? } => 偶数以外を返す
partition(関連)
ブロックの真偽で配列を二分し、[[真の要素配列],[偽の要素配列]] を返す。select と組合せて使いやすい。
detect / find の別名・関連
find
detect の正式な別名。最初に条件を満たす要素1つを返す。
例: ary.find { |x| x > 5 }
find_index(関連)
条件を満たす最初の要素の添字を返す(要素自体ではない)。
例: ary.find_index { |x| x > 5 }
collect / map の別名・関連
collect と map は相互に同義(エイリアス)。各要素を変換して新配列を返す。
each_with_object / each_with_index(関連)
map と同様に要素を処理するが、戻り値の形や副作用の表現が異なる(変換結果を自分で蓄える)。
flat_map(関連)
各要素を変換し、その結果を flatten(1) して一つの配列で返す(map + flatten(1) 相当)。
補足メモ(使い分けのヒント)
可読性優先なら最新の Ruby では filter を使うと意図が直感的に伝わる。
逆の操作が欲しいときは reject、真偽両方まとめて欲しいときは partition。
要素を 1 件だけ取りたいときは find/detect、インデックスが欲しければ find_index。
要素を別の要素群に展開したいときは flat_map。
| メソッド | 同義・説明 | 備考 |
|---|---|---|
| select ⇄ find_all | ブロックが真の要素をすべて返す(フィルタ) | 複数要素抽出に使用 |
| detect ⇄ find | ブロックを満たす最初の要素を返す | 見つからなければ nil |
| collect ⇄ map | 各要素に変換を適用して配列を返す(マッピング) | 要素数は変わらない |
| filter | select の別名(Ruby 2.6+) | 可読性向上のために使われる |
| reject | select の逆、ブロックが真の要素を除外して返す | フィルタの反転 |
| grep | 正規表現や === にマッチする要素を返す | オブジェクトや Regexp で使える |
| grep_v | grep の逆、マッチしない要素を返す | |
| find_index / index | 条件を満たす要素のインデックスを返す | 要素自体ではなく添字を返す |
| partition | ブロックで真偽を分けて [truthy_array, falsy_array] を返す | 真偽両方を同時に取得 |
| flat_map | 各要素を変換し結果を flatten(1) して返す | map + flatten(1) 相当 |
まとめ
主要な「同義」ペアは select ↔ find_all, detect ↔ find, collect ↔ map。
他にも用途に応じて使える便利なメソッドがあるので、具体的な目的(最初の一致が欲しい/全件を取得したい/否定で取りたい/パターンで取りたい)を基に選ぶといいそうです。