Ruby find_all vs select, care este treaba?

Cu o lună în urmă nu știam absolut nimic despre limbajul de programare Ruby. Tocmai dădusem un interviu folosind Javascript pentru Flatiron School, unde se predau atât Javascript cât și Ruby. Fast forward până acum, nu mă mai satur de el!

Să fiu acceptat la Flatiron School a fost doar începutul. La scurt timp au urmat o sută de ore de prelucrare Ruby, unde am învățat tone de metode Ruby de care aveam nevoie pentru a construi aplicații funcționale.

Dintre aceste metode din Ruby, find_all și select mi-au ieșit în evidență pentru că păreau că realizează același lucru. Cercetarea inițială m-a condus la a găsi…

find_all

select

Așteaptă, nu sunt ele identice!?

Bine, oarecum. O scufundare mai adâncă în documentația Ruby m-a făcut să descopăr că există ceva mai mult sub capotă.

Un obiect este enumerabil dacă descrie un set de elemente și o metodă pentru a trece în buclă peste fiecare dintre ele. În Ruby, Enumerable#find_all și Enumerable#select sunt același cod. Array-urile din Ruby moștenesc din Enumerable, astfel încât rularea find_all sau select pe un Array în Ruby va produce același rezultat.

Dar începe să se complice atunci când se face o buclă peste un hash. Un hash este o colecție de perechi cheie-valoare. Dacă sunteți mai familiarizați cu Javascript, un hash în Ruby este ca un obiect în Javascript.

**Pe un hash, find_all returnează un 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

**Pe un hash, select returnează un hash în loc de un array**

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

Atunci de ce find_all și select dau rezultate diferite atunci când rulează pe un hash? Cu un Hash, find_all moștenește în continuare din Enumerable, dar select este redefinit pentru a returna un Hash în loc de un Array. Diferență subtilă, dar importantă!

Morala poveștii, gândiți-vă la ceea ce doriți să returnați atunci când folosiți select sau find_all (și, de fapt, orice metodă din ingineria software) înainte de a o folosi!

Yay, am reușit!

Lasă un răspuns

Adresa ta de email nu va fi publicată.