Injiseringsmetode: Forklart
i dag tar vi en titt på ruby ‘ s inject method (#inject). Som alle som er langt nok sammen på reisen for å lære mer om koding, vet du at språk er fylt med forvirrende, fantastiske metoder og funksjoner. Nylig kom jeg over en av disse forvirrende, og som jeg har lært, awesome metoder, injisere. Jeg prøvde å summere en rekke heltall og trodde feilaktig at ruby hadde en innfødt # sum-metode, men ingen slik flaks. Så, jeg kom til googling og fant #inject.
#inject-metoden fungerer på samme måte som # reduser-metoden, og de betraktes som aliaser. Disse enumerator metoder kan ta en rekke eller rekke tall, og kan eventuelt motta en blokk. Når det kalles, vil injiseringsmetoden passere hvert element og akkumulere hver sekvensielt.
.inject(:+) => (((3 + 6) + 10) + 13) => 32
ELLER
.inject {|sum, number| sum + number} =>|3, 6| 3 + 6 => 9
=>|9, 10| 9 + 10 =>19
inject tar det første elementet i samlingen din og bruker det som base ‘sum’. Det tar deretter det neste elementet (eller det andre elementet i arrayet) og legger dem sammen. Metoden tilordner deretter resultatet til summen og legger til i neste element i samlingen til alle elementene har blitt sendt gjennom blokken. I dette tilfellet er ‘sum’ det vi kaller en akkumulator-som det akkumulerer verdiene. Returverdien vil være summen av alle elementene i samlingen.
denne metoden er nysgjerrig fordi du også kan gi den en standardverdi for akkumulatoren. Se nedenfor:
.inject(0, :+) => 32.inject(0) {|sum, number| sum + number} => 19
Her gir du metoden en startverdi for akkumulatoren, siden jeg passerte den null, vil metoden legge det første elementet i samlingen til null før du går videre til tillegg av andre og tredje elementer i samlingen.
nå som vi vet hvordan du legger til verdier fra samlinger… la oss utforske de andre programmene av #inject.
Building Hashes:
# Inject kan være svært kraftig utenfor å legge verdier sammen. La oss si at du har data eller en returverdi som er en rekke arrays som inneholder nøkler og verdier (dvs.]). Du vil mest sannsynlig at de skal være viktige: verdipar i en hash. Inject kan svært raskt og elegant hjelpe deg å få det gjort.
, ].inject({}) do |result, element|
result = element.last
result
end
#=> {:student=>"Terrance Koar", :course=>"Web Dev"}
i dette eksemplet starter vi med en rekke arrays som inneholder nøkkel-og verdipar. Når vi kaller injisere og passere i et argument av en tom hash, som vil fungere som akkumulator(eller i dette tilfellet ‘resultat’). Deretter itererer metoden gjennom hvert element og injiserer det i hash ved hjelp av blokken som følger med. Blokken tilordner nøkkelelementet, som kommer først, som en nøkkel i den nye hash og setter verdien lik det andre elementet i det nestede arrayet. En annen ting å merke seg her er at returverdien av inject er det neste ga resultatet (vanligvis summen av heltall). Siden vi vil ha vår hash, må vi eksplisitt returnere ‘resultat’ hash.i Tillegg kan inject brukes til å konvertere datatyper ved hjelp av noen andre kule metoder — selv når det bygger en ny hash!
, ].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"=>}
Inject stopper ikke der skjønt. Det kan også filtrere og bygge et nytt array!
.inject() do |result, element|
result << element.to_s if element > 9
result
end# =>
her passerer vi injisere en innledende verdi av et tomt array. Det første elementet mellom / / vil alltid være ‘resultatet’ eller akkumulatoren i blokken. Så, når resultatet er satt lik en tom matrise, kan vi spade i et element som passerer vårt filter, i dette tilfellet hvis elementet er større enn 9. Igjen, siden injects returverdi er det neste ga resultatet, må vi eksplisitt returnere resultatet.