Ruby find_all vs select, what’s the deal?

För en månad sedan visste jag absolut ingenting om programmeringsspråket Ruby. Jag hade precis intervjuat med Javascript för Flatiron School där de lär ut både Javascript OCH Ruby. Snabbt framåt till nu kan jag inte få nog av det!

Att bli antagen till Flatiron School var bara början. Hundra timmars Ruby-förarbete följde kort därefter där vi lärde oss massor av Ruby-metoder som vi skulle behöva för att bygga funktionella appar.

Av dessa metoder i Ruby stod find_all och select ut för mig eftersom det verkade som om de åstadkom samma sak. Den inledande forskningen ledde mig till att hitta…

find_all

select

Vänta, är de inte identiska!?

Nja, på sätt och vis. En djupare dykning i Ruby-dokumentationen fick mig att upptäcka att det finns lite mer under huven.

Ett objekt är uppräkningsbart om det beskriver en uppsättning objekt och en metod för att slinga över vart och ett av dem. I Ruby är Enumerable#find_all och Enumerable#select samma kod. Arrayer i Ruby ärver från Enumerable, så att köra find_all eller select på en Array i Ruby ger samma resultat.

Men det börjar bli komplicerat när man loopar över en hash. En hash är en samling av nyckel- och värdepar. Om du är mer bekant med Javascript är en hash i Ruby som ett objekt i Javascript.

**Om en hash returnerar find_all en array**

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

**Om en hash returnerar select en hash istället för en array**

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

Så varför ger find_all och select olika resultat när de körs på en hash? Med en hash ärver find_all fortfarande från Enumerable men select är omdefinierat för att returnera en hash i stället för en array. Subtil men viktig skillnad!

Moralen i historien, tänk på vad du vill returnera när du använder select eller find_all (och egentligen vilken metod som helst inom programvaruteknik) innan du använder den!

Ja, vi klarade det!

Lämna ett svar

Din e-postadress kommer inte publiceras.