Ruby find_all vs select, what’s the deal?

Vor einem Monat wusste ich absolut nichts über die Programmiersprache Ruby. Ich hatte mich gerade mit Javascript für die Flatiron School beworben, wo sie sowohl Javascript als auch Ruby unterrichten. Heute kann ich gar nicht genug davon bekommen!

Die Aufnahme in die Flatiron School war nur der Anfang. Kurz darauf folgten hundert Stunden Ruby-Vorbereitung, in denen wir tonnenweise Ruby-Methoden lernten, die wir für die Entwicklung funktionaler Anwendungen benötigen würden.

Von diesen Methoden in Ruby stachen find_all und select für mich heraus, weil sie anscheinend dasselbe bewirken. Erste Recherchen führten mich zu …

find_all

select

Warte, sind die nicht identisch!

Nun ja, irgendwie schon. Ein tieferes Eintauchen in die Ruby-Dokumente führte mich zu der Entdeckung, dass es unter der Haube ein bisschen mehr gibt.

Ein Objekt ist aufzählbar, wenn es eine Menge von Elementen und eine Methode beschreibt, um eine Schleife über jedes von ihnen zu machen. In Ruby sind Enumerable#find_all und Enumerable#select der gleiche Code. Arrays in Ruby erben von Enumerable, so dass die Ausführung von find_all oder select auf einem Array in Ruby das gleiche Ergebnis liefert.

Aber es wird kompliziert, wenn man eine Schleife über einen Hash macht. Ein Hash ist eine Sammlung von Schlüssel-Wert-Paaren. Wenn Sie mit Javascript vertrauter sind, ist ein Hash in Ruby wie ein Objekt in Javascript.

**Bei einem Hash gibt find_all ein Array zurück**

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

**Bei einem Hash gibt select einen Hash statt eines Arrays zurück**

hash = {a: 1, b: 2, c: 3, d: 4}hash.select do |key, value|
value.odd?
end#would return {a:1, c:3}

Warum liefern also find_all und select unterschiedliche Ergebnisse, wenn sie über einen Hash laufen? Bei einem Hash erbt find_all immer noch von Enumerable, aber select ist neu definiert, um einen Hash anstelle eines Arrays zurückzugeben. Ein feiner, aber wichtiger Unterschied!

Moral der Geschichte, denken Sie darüber nach, was Sie zurückgeben wollen, wenn Sie select oder find_all (und wirklich jede Methode in der Softwareentwicklung) verwenden, bevor Sie sie einsetzen!

Ja, wir haben es geschafft!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.