Ruby find_all vs select, qual è il problema?

Un mese fa non sapevo assolutamente nulla del linguaggio di programmazione Ruby. Avevo appena fatto un colloquio usando Javascript per Flatiron School dove insegnano sia Javascript che Ruby. Non ne ho mai abbastanza!

Essere accettato alla Flatiron School è stato solo l’inizio. Sono seguite un centinaio di ore di pre-lavoro su Ruby, dove abbiamo imparato tonnellate di metodi Ruby di cui avremmo avuto bisogno per costruire applicazioni funzionali.

Di questi metodi in Ruby, find_all e select mi hanno colpito perché sembravano compiere la stessa cosa. La ricerca iniziale mi ha portato a trovare…

find_all

select

Aspetta, non sono identici!

Beh, più o meno. Un’immersione più profonda nella documentazione di Ruby mi ha portato a scoprire che c’è un po’ di più sotto il cofano.

Un oggetto è enumerabile se descrive un insieme di elementi e un metodo per fare un ciclo su ognuno di essi. In Ruby, Enumerable#find_all e Enumerable#select sono lo stesso codice. Gli array in Ruby ereditano da Enumerable, quindi eseguire find_all o select su un array in Ruby darà lo stesso risultato.

Ma le cose si complicano quando si fa un loop su un hash. Un hash è una collezione di coppie chiave-valore. Se hai più familiarità con Javascript, un hash in Ruby è come un oggetto in Javascript.

** Su un hash, find_all restituisce 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

** Su un hash, select restituisce un hash invece di 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}

Perché find_all e select danno risultati diversi quando funzionano su un hash? Con un hash, find_all eredita ancora da Enumerable ma select è ridefinito per restituire un hash invece di un array. Sottile ma importante differenza!

Morale della storia, pensate a cosa volete restituire quando usate select o find_all (e davvero qualsiasi metodo nell’ingegneria del software) prima di usarlo!

Sì, l’abbiamo fatto!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.