Articles

injektionsmetod: förklarad

idag tar vi en titt på Rubys injektionsmetod (#inject). Som alla som är tillräckligt långt på sin resa för att lära sig mer om kodning, vet du att språk är fyllda med förvirrande, fantastiska metoder och funktioner. Nyligen kom jag över en av dessa förvirrande, och som jag har lärt mig, fantastiska metoder, injicera. Jag försökte summera en rad heltal och trodde felaktigt att ruby hade en inbyggd #sum-metod, men ingen sådan tur. Så jag fick googla och hittade #inject.

#inject-metoden fungerar på samma sätt som #reduce-metoden, och de betraktas som Alias. Dessa uppräkningsmetoder kan ta ett intervall eller en rad siffror och kan valfritt ta emot ett block. När den anropas kommer injektionsmetoden att passera varje element och ackumulera varje sekventiellt.

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

eller

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

för att bryta ner detta ytterligare, inject tar det första elementet i din samling och använder det som bas ”summa”. Det tar sedan nästa element (eller det andra elementet i matrisen) och lägger sedan till dem tillsammans. Metoden tilldelar sedan resultatet till ’summan’ och lägger till i nästa element i samlingen tills alla element har passerat genom blocket. I det här fallet är ’summa’ vad vi kallar en ackumulator — eftersom den ackumulerar värdena. Returvärdet kommer att vara summan av alla element i samlingen.

den här metoden är nyfiken eftersom du också kan skicka det ett standardvärde för ackumulatorn. Se nedan:

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

Här ger du metoden ett startvärde för ackumulatorn, eftersom jag passerade det noll, kommer metoden att lägga till det första elementet i samlingen till noll innan du går vidare till tillägget av det andra och tredje elementet i samlingen.

nu när vi vet hur man lägger till värden från samlingar… låt oss utforska de andra applikationerna av #inject.

bygga Hashes:

#Inject kan vara mycket kraftfull utanför att lägga till värden tillsammans. Låt oss säga att du har data eller ett returvärde som är en array av arrayer som innehåller nycklar och värden (dvs ]). Du kommer sannolikt att vilja att de ska vara nyckel: värdepar i en hash. Injicera kan mycket snabbt och elegant hjälpa dig att få det gjort.

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

i det här exemplet börjar vi med en rad arrayer som innehåller nyckel-och värdepar. När vi kallar injicera och passera i ett argument av en tom hash, som kommer att fungera som ackumulator (eller i detta fall ’resultat’). Sedan itererar metoden genom varje element och injicerar det i hash med hjälp av det medföljande blocket. Blocket tilldelar nyckelelementet, som kommer först, som en nyckel i den nya hash och ställer in värdet lika med det andra elementet i den kapslade matrisen. En annan sak att notera här är att returvärdet för inject är nästa gav resultat (vanligtvis summan av heltal). Eftersom vi vill ha vår hash måste vi uttryckligen returnera ’resultatet’ hash.

dessutom kan inject användas för att konvertera datatyper med hjälp av några andra coola metoder — även 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 slutar dock inte där. Det kan också filtrera och bygga en ny array!

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

här passerar vi injicera ett initialvärde för en tom array. Det första elementet mellan / / kommer alltid att vara ’resultat’ eller ackumulator i blocket. Så, när resultatet är inställt lika med en tom matris, kan vi skotta i vilket element som helst som passerar vårt filter, i det här fallet om elementet är större än 9. Återigen, eftersom injects returvärde är nästa gav resultat, måste vi uttryckligen returnera resultatet.