Ruby find_all vs select, what’s the deal?

1 か月前、私はプログラミング言語 Ruby についてまったく何も知りませんでした。 私は、Javascript と Ruby の両方を教えている Flatiron School で Javascript を使用して面接を受けたところでした。 9046>

Flatiron School に合格したことは、ほんの始まりにすぎませんでした。 100 時間にわたる Ruby のプレワークで、機能的なアプリケーションを構築するために必要な Ruby のメソッドを大量に学びました。

これらの Ruby のメソッドのうち、find_all と select は、同じことを達成しているように見えたので、私には際立って見えました。 最初に調査したところ、find_all と select は同じことを達成するように思えたからです。

find_all

select

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 (そしてソフトウェアエンジニアリングにおける本当にすべてのメソッド) を使うときに何を返したいか、使う前に考えてください!

やった、できたぞ!

コメントを残す

メールアドレスが公開されることはありません。