Articles

Pistosmenetelmä: selitetty

tänään tutustutaan Rubyn pistämistapaan (#pistää). Kuten jokainen, joka on tarpeeksi pitkällä matkallaan oppiakseen lisää koodaamisesta, tiedät kielet ovat täynnä hämmentäviä, mahtavia menetelmiä ja toimintoja. Äskettäin, törmäsin yksi näistä hämmentävä, ja kuten olen oppinut, mahtava menetelmiä, pistää. Yritin summata joukon kokonaislukuja ja erehdyin luulemaan, että Rubylla oli natiivi #sum-menetelmä, mutta ei sellaista onnea. Joten, pääsin googlaamaan ja löysin #pistää.

# – pistosmenetelmä toimii samoin kuin #reduce-menetelmä, ja niitä pidetään peiteniminä. Nämä enumerator menetelmiä voi ottaa erilaisia tai joukko numeroita, ja voi vaihtoehtoisesti saada lohkon. Kun pistosmenetelmää kutsutaan, se läpäisee jokaisen alkuaineen ja kerryttää jokaisen peräkkäin.

.inject(:+) => (((3 + 6) + 10) + 13) => 32

tai

.inject {|sum, number| sum + number} =>|3, 6| 3 + 6 => 9
=>|9, 10| 9 + 10 =>19

tämän erittelemiseksi vielä tarkemmin, injection ottaa kokoelmansa ensimmäisen elementin ja käyttää sitä pohjana ”summana”. Se sitten ottaa seuraavan elementin (tai toisen elementin array) ja sitten lisää ne yhteen. Tämän jälkeen menetelmä määrittää tuloksen ”summaksi” ja lisää seuraavan elementin kokoelmaan, kunnes kaikki elementit on läpäisty lohkon läpi. Tässä tapauksessa ”summa” on niin sanottu kertymä — sillä se kerryttää arvoja. Palautusarvo on kaikkien kokoelman elementtien summa.

tämä menetelmä on erikoinen, koska voit myös siirtää sille varaajan oletusarvon. Katso alla:

.inject(0, :+) => 32.inject(0) {|sum, number| sum + number} => 19

tässä annetaan menetelmälle alkuarvo kertymälle, koska läpäisin sen nollasta, menetelmässä lisätään kokoelman ensimmäinen alkio nollaan ennen kuin siirrytään lisäämään kokoelman toinen ja kolmas alkio.

nyt kun osaamme lisätä arvoja kokoelmista… tutustutaan #injectin muihin sovelluksiin.

Rakennushehkutukset:

#pistos voi olla hyvin voimakas arvojen yhteenlaskun ulkopuolella. Sanotaan, että sinulla on tietoja tai paluuarvo, joka on joukko ryhmiä, jotka sisältävät avaimet ja arvot (eli,]). Olet todennäköisesti haluavat, että ne ovat avain: arvo paria hash. Pistäminen voi auttaa sinua saamaan tämän tehdyksi hyvin nopeasti ja tyylikkäästi.

, ].inject({}) do |result, element| 
result = element.last
result
end
#=> {:student=>"Terrance Koar", :course=>"Web Dev"}

tässä esimerkissä lähdetään liikkeelle joukolla avain-ja arvopareja sisältäviä taulukoita. Kun kutsumme pistää ja siirtää argumentti tyhjä hash, joka toimii akun (tai tässä tapauksessa ”tulos”). Sitten menetelmä iteroituu jokaisen elementin läpi ja injektoi sen hasikseen käyttäen annettua lohkoa. Lohko määrittää avainelementin, joka tulee ensin, avaimena uudessa hajautuksessa ja asettaa arvon, joka on sama kuin toinen elementti sisäkkäisessä matriisissa. Toinen asia huomata tässä on, että return arvo pistää on seuraava tuotti tuloksen (tyypillisesti summa kokonaislukuja). Koska haluamme hasiksemme, meidän on nimenomaisesti palautettava ”tulos” hash.

lisäksi pistosta voidaan käyttää tietotyyppien muuntamiseen joidenkin muiden viileiden menetelmien avulla — vaikka se rakentaisi uutta hasista!

, ].inject({}) do |result, element| 
result = element.last.upcase
result
end
# => {"student"=>"TERRANCE KOAR", "course"=>"WEB DEV"}OR, ].inject({}) do |result, element|
result = element.last.split
result
end# => {"student"=>, "course"=>}

pistos ei kuitenkaan lopu tähän. Se voi myös suodattaa ja rakentaa uuden array!

.inject() do |result, element| 
result << element.to_s if element > 9
result
end# =>

tässä pistetään tyhjän joukon alkuarvo. Ensimmäinen elementti||: n välissä on aina lohkossa oleva ”tulos” eli kertymä. Niin, kun tulos on asetettu yhtä tyhjän array, voimme lapio tahansa elementti, joka kulkee meidän suodatin, tässä tapauksessa, jos elementti on suurempi kuin 9. Jälleen, koska injektion tuottoarvo on seuraava saatu tulos, meidän on nimenomaisesti palautettava tulos.