Ruby find_all vs select, mikä on homman ydin?

Kuukausi sitten en tiennyt mitään ohjelmointikielestä Ruby. Olin juuri haastatellut Javascriptillä Flatiron Schooliin, jossa opetetaan sekä Javascriptiä että Rubya. Nopeasti eteenpäin nyt en saa siitä tarpeekseni!

Hyväksyminen Flatiron Schooliin oli vasta alkua. Pian seurasi sata tuntia Rubyn esivalmisteluja, joissa opettelimme tonneittain Rubyn metodeja, joita tarvitsisimme rakentaaksemme toimivia sovelluksia.

Näistä Rubyn metodeista find_all ja select erottuivat minusta, koska ne tuntuivat saavuttavan saman asian. Alustavat tutkimukset johtivat minut löytämään…

find_all

selektiivi

>

Varoittelehan nyt, eikö ne olekin identtiset!?

No, tavallaan. Syvempi sukellus Rubyn dokumentteihin johti minut huomaamaan, että konepellin alla on hieman enemmän.

Objekti on lueteltava, jos se kuvaa joukon kohteita ja metodin, jolla voi käydä silmukassa läpi jokaisen kohteen. Rubyssä Enumerable#find_all ja Enumerable#select ovat samaa koodia. Rubyn Arrayt periytyvät Enumerablesta, joten find_all- tai select-toiminnon suorittaminen Arraylle Rubyssa tuottaa saman tuloksen.

MUTTA se alkaa muuttua monimutkaiseksi, kun silmukoidaan hashin yli. Hash on kokoelma avain-arvopareja. Jos olet enemmän perehtynyt Javascriptiin, hash on Rubyssä kuin objekti Javascriptissä.

**Hash-arvojen päällä find_all palauttaa joukon**

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

**Hash-arvojen päällä select palauttaa joukon sijasta hashin**

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

Miksi siis find_all ja select tuottavat erilaiset tulokset, kun ne suoritetaan hashin päällä? Hashin kanssa find_all periytyy edelleen Enumerablesta, mutta select on määritelty uudelleen palauttamaan Hash Array:n sijaan. Hienovarainen mutta tärkeä ero!

Tarinan moraali: mieti, mitä haluat palauttaa käyttäessäsi selectiä tai find_all:ia (ja oikeastaan mitä tahansa ohjelmistotekniikan metodia), ennen kuin käytät sitä!

Jee, me teimme sen!

Vastaa

Sähköpostiosoitettasi ei julkaista.