Ruby find_all vs select, what’s the deal?

For en måned siden vidste jeg absolut intet om programmeringssproget Ruby. Jeg havde lige været til samtale med Javascript til Flatiron School, hvor de underviser i både Javascript OG Ruby. Hurtigt frem til nu kan jeg ikke få nok af det!

At blive optaget på Flatiron School var kun begyndelsen. Hundrede timers Ruby-forarbejde fulgte kort efter, hvor vi lærte tonsvis af Ruby-metoder, som vi skulle bruge for at bygge funktionelle apps.

Af disse metoder i Ruby skilte find_all og select sig ud for mig, fordi de virkede som om, de udførte det samme. Den indledende research førte mig til at finde …

find_all

select

Wait, er de ikke identiske!?

Nu, på en måde. En dybere dykning i Ruby-dokumentationen fik mig til at opdage, at der er lidt mere under kølerhjelmen.

Et objekt er enumerable, hvis det beskriver et sæt elementer og en metode til at løbe over hvert af dem. I Ruby er Enumerable#find_all og Enumerable#select den samme kode. Arrays i Ruby arver fra Enumerable, så hvis du kører find_all eller select på et Array i Ruby, giver det samme resultat.

Men det begynder at blive kompliceret, når du laver en sløjfe over en hash. En hash er en samling af nøgle-værdipar. Hvis du er mere fortrolig med Javascript, er en hash i Ruby ligesom et objekt i Javascript.

**Om en hash returnerer find_all et 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 returnerer select en hash i stedet for et 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å hvorfor giver find_all og select forskellige resultater, når de kører på en hash? Med en Hash arver find_all stadig fra Enumerable, men select er omdefineret til at returnere en Hash i stedet for et Array. Subtil, men vigtig forskel!

Moral i historien: Tænk over, hvad du vil returnere, når du bruger select eller find_all (og egentlig enhver metode inden for software engineering), før du bruger den!

Ja, vi gjorde det!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.