Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. Enumerable.find / find_all / detect

Enumerable.find / find_all / detect

コレクションから条件に一致する要素を検索するメソッドです。『find』は最初の1件、『find_all』はすべての一致要素を返します。

構文
# 条件に一致する最初の要素を返します。
コレクション.find { |要素| 条件 }
コレクション.detect { |要素| 条件 }  # find の別名

# 条件に一致するすべての要素を配列で返します。
コレクション.find_all { |要素| 条件 }
コレクション.select { |要素| 条件 }   # find_all の別名

# 条件に一致しない要素をすべて返します。
コレクション.reject { |要素| 条件 }
メソッド一覧
メソッド概要
find条件に一致する最初の要素を返します。一致しない場合は『nil』を返します。
detect『find』の別名です。同じ動作をします。
find_all条件に一致するすべての要素を配列で返します。一致しない場合は空配列を返します。
select『find_all』の別名です。同じ動作をします。
reject条件に一致しない要素をすべて配列で返します。『select』の逆の動作をします。
サンプルコード
数値 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 最初の偶数を検索します。
最初の偶数 = 数値.find { |n| n.even? }
puts 最初の偶数  # 2

# 一致しない場合は nil が返ります。
大きい数 = 数値.find { |n| n > 100 }
puts 大きい数.nil?  # true

# すべての偶数を取得します。
偶数一覧 = 数値.find_all { |n| n.even? }
puts 偶数一覧.inspect  # [2, 4, 6, 8, 10]

# ハッシュの配列から条件で絞り込みます。
ユーザー = [
  { name: "田中", age: 25 },
  { name: "山田", age: 17 },
  { name: "鈴木", age: 30 },
  { name: "佐藤", age: 15 }
]

# 18歳未満のユーザーを reject で除外します。
成人のみ = ユーザー.reject { |u| u[:age] < 18 }
puts 成人のみ.map { |u| u[:name] }.inspect  # ["田中", "鈴木"]
概要

『find』と『find_all』はEnumerableモジュールのメソッドで、配列やハッシュなどあらゆるコレクションで使用できます。『find』は最初の一致要素のみを返すため、存在確認や1件取得に適しています。

『select』は『find_all』の別名として広く使われており、実際のコードでは『select』のほうが多く見られます。条件に一致しない要素を除外する場合は『reject』が直感的に書けます。『find』で一致しない場合は『nil』が返るため、戻り値を使う前に『nil?』や『&.』(ぼっち演算子)でチェックすることをお勧めします。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。