Ruby find_all vs select, mi a helyzet?

Egy hónappal ezelőtt még egyáltalán nem tudtam semmit a Ruby programozási nyelvről. Éppen egy Javascriptet használó interjúra jelentkeztem a Flatiron Schoolba, ahol Javascriptet ÉS Rubyt is tanítanak. Gyorsan előretekintve mostanra nem tudok betelni vele!

A Flatiron Schoolba való felvétel csak a kezdet volt. Rövidesen száz óra Ruby-előkészítő munka következett, ahol rengeteg Ruby-módszert tanultunk meg, amire szükségünk lesz a funkcionális alkalmazások építéséhez.

Ezek közül a Ruby-módszerek közül a find_all és a select kiemelkedett számomra, mert úgy tűnt, hogy ugyanazt a dolgot valósítják meg. A kezdeti kutatások arra vezettek, hogy megtaláljam a…

find_all

select

Várj, Hát nem egyformák!

Hát, valahogy úgy. Egy mélyebb merülés a Ruby dokumentációjában vezetett arra, hogy felfedeztem, hogy a motorháztető alatt egy kicsit több van.

Egy objektum felsorolható, ha leírja az elemek egy halmazát és egy módszert az egyes elemeken való végighaladásra. A Rubyban az Enumerable#find_all és az Enumerable#select ugyanaz a kód. A Rubyban a tömbök az Enumerable-től örökölnek, így a find_all vagy a select futtatása egy tömbön Rubyban ugyanazt az eredményt fogja adni.

De kezd bonyolulttá válni, amikor egy hash felett hurkot hajtunk végre. A hash kulcs-érték párok gyűjteménye. Ha jobban ismered a Javascriptet, a hash a Rubyban olyan, mint egy objektum a Javascriptben.

**A hash-on a find_all egy tömböt ad vissza**

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

**A hash-on a select egy hash-t ad vissza tömb helyett**

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

Azért miért ad a find_all és a select különböző eredményeket, ha egy hash-on fut? Egy Hash esetén a find_all továbbra is az Enumerable-től örököl, de a select át van definiálva, hogy egy Hash-t adjon vissza egy Array helyett. Finom, de fontos különbség!

A történet tanulsága, gondoljuk át, hogy mit akarunk visszaadni a select vagy find_all (és igazából minden szoftverfejlesztési módszer) használatakor, mielőtt használnánk!

Yay, megcsináltuk!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.