Ruby find_all vs select, what’s the deal?

Een maand geleden wist ik helemaal niets van de programmeertaal Ruby. Ik had net een interview gedaan met Javascript voor Flatiron School waar ze zowel Javascript als Ruby onderwijzen. En nu kan ik er niet genoeg van krijgen!

Toelating tot Flatiron School was nog maar het begin. Er volgden honderd uur Ruby-voorwerk waarin we tonnen Ruby-methoden leerden die we nodig zouden hebben om functionele apps te bouwen.

Van deze methoden in Ruby sprongen find_all en select er voor mij uit omdat ze hetzelfde leken te doen. Aanvankelijk onderzoek leidde me naar het vinden…

find_all

select

Wacht, zijn ze niet identiek!

Nou, zo ongeveer. Een diepere duik in de Ruby-documenten leidde me tot de ontdekking dat er iets meer onder de motorkap zit.

Een object is telbaar als het een verzameling items beschrijft en een methode om over elk van hen een lus te maken. In Ruby, Enumerable#find_all en Enumerable#select zijn dezelfde code. Arrays in Ruby erven van Enumerable, dus het uitvoeren van find_all of select op een Array in Ruby zal hetzelfde resultaat opleveren.

Maar het begint ingewikkeld te worden als je over een hash heen lusd. Een hash is een verzameling van sleutel-waarde paren. Als je meer bekend bent met Javascript, is een hash in Ruby als een object in Javascript.

**Op een hash geeft find_all een array terug**

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

**Op een hash geeft select een hash terug in plaats van een array**

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

Dus waarom geven find_all en select verschillende resultaten wanneer ze op een hash worden uitgevoerd? Met een Hash erft find_all nog steeds van Enumerable, maar select is geherdefinieerd om een Hash terug te geven in plaats van een Array. Subtiel maar belangrijk verschil!

De moraal van het verhaal, denk na over wat je wilt teruggeven als je select of find_all gebruikt (en eigenlijk elke methode in software engineering) voordat je hem gebruikt!

Ja, het is ons gelukt!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.