Articles

Injiceringsmetode: forklaret

i dag tager vi et kig på Ruby ‘ s inject method (#inject). Som enhver, der er langt nok på deres rejse til at lære mere om kodning, Ved du, at sprog er fyldt med forvirrende, fantastiske metoder og funktioner. For nylig, jeg stødte på en af disse forvirrende, og som jeg har lært, fantastiske metoder, injicere. Jeg forsøgte at opsummere en række heltal og fejlagtigt troede, at ruby havde en indfødt #sum metode, men ikke sådan held. Så jeg kom til googling og fandt #inject.

#inject-metoden fungerer på samme måde som #reducer-metoden, og de betragtes som aliaser. Disse optællingsmetoder kan tage et interval eller en række tal og kan eventuelt modtage en blok. Når det kaldes, vil injektionsmetoden passere hvert element og akkumulere hver sekventielt.

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

eller

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

for at nedbryde dette yderligere tager inject det første element i din samling og bruger det som basis ‘sum’. Det tager derefter det næste element (eller det andet element i arrayet) og tilføjer dem derefter sammen. Metoden tildeler derefter dette resultat til ‘summen’ og tilføjer det næste element i samlingen, indtil alle elementer er passeret gennem blokken. I dette tilfælde er ‘sum’ det, vi kalder en akkumulator — da det akkumulerer værdierne. Returværdien er summen af alle elementer i samlingen.

denne metode er nysgerrig, fordi du også kan give den en standardværdi for akkumulatoren. Se nedenfor:

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

Her giver du metoden en startværdi for akkumulatoren, da jeg passerede den nul, vil metoden tilføje det første element i samlingen til nul, før du går videre til tilføjelsen af det andet og tredje element i samlingen.

nu hvor vi ved, hvordan man tilføjer værdier fra samlinger… lad os undersøge de andre applikationer af #inject.

Building Hashes:

#Inject kan være meget kraftfuld uden at tilføje værdier sammen. Lad os sige, at du har data eller en returværdi, der er en række arrays, der indeholder nøgler og værdier (dvs.]). Du vil sandsynligvis have dem til at være nøglen: værdipar i en hash. Injicer kan meget hurtigt og elegant hjælpe dig med at få det gjort.

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

i dette eksempel starter vi med en række arrays, der indeholder nøgle-og værdipar. Når vi kalder injicere og passere i et argument af en tom hash, som vil fungere som akkumulatoren (eller i dette tilfælde ‘resultat’). Derefter gentager metoden gennem hvert element og injicerer det i hash ved hjælp af den medfølgende blok. Blokken tildeler nøgleelementet, som kommer først, som en nøgle i den nye hash og indstiller værdien svarende til det andet element i det indlejrede array. En anden ting at bemærke her er, at returværdien af inject er det næste gav resultat (typisk summen af heltal). Da vi ønsker vores hash, skal vi eksplicit returnere ‘resultat’ hash.

derudover kan inject bruges til at konvertere datatyper ved hjælp af nogle andre seje metoder — selv mens 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 dog ikke der. Det kan også filtrere og opbygge et nyt array!

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

Her er vi passerer injicere en startværdi på et tomt array. Det første element mellem / / vil altid være ‘resultatet’ eller akkumulatoren i blokken. Så, når resultatet er indstillet lig med et tomt array, vi kan skovle i ethvert element, der passerer vores filter, i dette tilfælde, hvis elementet er større end 9. Igen, da inject ‘ s returværdi er det næste gav resultat, skal vi eksplicit returnere resultatet.