Enumerable.find / find_all / detect
| 対応: | Ruby 1.8(2003) |
|---|
コレクションから条件に一致する要素を検索するメソッドです。『find』は最初の1件、『find_all』はすべての一致要素を返します。
構文
# 条件に一致する最初の要素を返します。
コレクション.find { |要素| 条件 }
コレクション.detect { |要素| 条件 } # find の別名
# 条件に一致するすべての要素を配列で返します。
コレクション.find_all { |要素| 条件 }
コレクション.select { |要素| 条件 } # find_all の別名
# 条件に一致しない要素をすべて返します。
コレクション.reject { |要素| 条件 }
メソッド一覧
| メソッド | 概要 |
|---|---|
| find | 条件に一致する最初の要素を返します。一致しない場合は『nil』を返します。 |
| detect | 『find』の別名です。同じ動作をします。 |
| find_all | 条件に一致するすべての要素を配列で返します。一致しない場合は空配列を返します。 |
| select | 『find_all』の別名です。同じ動作をします。 |
| reject | 条件に一致しない要素をすべて配列で返します。『select』の逆の動作をします。 |
サンプルコード
sample_enumerable_find_find_all.rb
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 最初の偶数を検索します。
first_even = numbers.find { |n| n.even? }
puts first_even # 2
# 一致しない場合は nil が返ります。
large = numbers.find { |n| n > 100 }
puts large.nil? # true
# すべての偶数を取得します。
evens = numbers.find_all { |n| n.even? }
puts evens.inspect # [2, 4, 6, 8, 10]
# ハッシュの配列から条件で絞り込みます。
users = [
{ name: "孫悟空", age: 23, org: "カプセルコーポレーション" },
{ name: "ベジータ", age: 29, org: "カプセルコーポレーション" },
{ name: "ブルマ", age: 28, org: "カプセルコーポレーション" },
{ name: "クリリン", age: 25, org: "亀仙流" }
]
# 25歳以上のメンバーを find_all で取得します。
veterans = users.find_all { |u| u[:age] >= 25 }
puts veterans.map { |u| u[:name] }.inspect # ["ベジータ", "ブルマ", "クリリン"]
ruby enumerable_find_find_all.rb 2 true [2, 4, 6, 8, 10] ["ベジータ", "ブルマ", "クリリン"]
概要
『find』と『find_all』はEnumerableモジュールのメソッドで、配列やハッシュなどあらゆるコレクションで使用できます。『find』は最初の一致要素のみを返すため、存在確認や1件取得に適しています。
『select』は『find_all』の別名として広く使われており、実際のコードでは『select』のほうが多く見られます。条件に一致しない要素を除外する場合は『reject』が直感的に書けます。『find』で一致しない場合は『nil』が返るため、戻り値を使う前に『nil?』や『&.』(ぼっち演算子)でチェックすることをお勧めします。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。