1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

同じことをする Ruby の別名(別メソッド)

Posted at

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。

他にも用途に応じて使える便利なメソッドがあるので、具体的な目的(最初の一致が欲しい/全件を取得したい/否定で取りたい/パターンで取りたい)を基に選ぶといいそうです。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?