find_all
Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait.Wait, 同じじゃないですか!??
まあ、そんなところです。 Ruby のドキュメントを深く掘り下げると、ボンネットの下にもう少し多くのものがあることがわかりました。
オブジェクトは、アイテムのセットとそれらのそれぞれをループするメソッドを記述している場合、列挙可能です。 Ruby では、Enumerable#find_all と Enumerable#select は同じコードです。 Ruby の Array は Enumerable を継承しているので、Array に対して find_all や select を実行しても同じ結果になります。 ハッシュとは、キーと値のペアのコレクションです。
** ハッシュに対して find_all は配列を返します**
hash = {a: 1, b: 2, c: 3, d: 4}hash.find_all do |key, value|
value.odd?
end#would return , ] because the find_all method is #inherited from Enumerable
** ハッシュに対して select は配列ではなくハッシュを返します**
hash = {a: 1, b: 2, c: 3, d: 4}hash.select do |key, value|
value.odd?
end#would return {a:1, c:3}
では、なぜ find_all と select はハッシュに対して異なる結果を出すのでしょうか。 Hash では、find_all は依然として Enumerable を継承していますが、select は Array ではなく Hash を返すように再定義されています。 微妙だけど重要な違いだ!
この話の教訓は、select や find_all (そしてソフトウェアエンジニアリングにおける本当にすべてのメソッド) を使うときに何を返したいか、使う前に考えてください!
やった、できたぞ!