Articles

injecteer methode: uitgelegd

vandaag kijken we naar Ruby ‘ s inject methode (#inject). Zoals iedereen die ver genoeg is op hun reis om meer te leren over coderen, Weet je talen zijn gevuld met verwarrende, geweldige methoden en functies. Onlangs kwam ik een van deze verwarrende, en zoals Ik heb geleerd, geweldige methoden, injecteren. Ik probeerde een array van gehele getallen op te sommen en dacht ten onrechte dat ruby een native #sum methode had, maar geen dergelijk geluk. Dus, ik heb googlen en vond # injecteren.

de # injecteer methode werkt hetzelfde als de # reduce methode, en ze worden beschouwd als aliassen. Deze enumerator methoden kunnen een bereik of array van getallen nemen, en kunnen optioneel een blok ontvangen. Wanneer geroepen, zal de injecteer methode elk element passeren en opeenvolgend accumuleren.

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

of

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

om dit nog verder op te splitsen, neemt inject het eerste element in uw verzameling en gebruikt dat als basis ‘sum’. Het neemt dan het volgende element (of het tweede element in de array) en voegt ze dan samen. De methode wijst dat resultaat dan toe aan de’ som ‘ en voegt het volgende element in de collectie toe totdat alle elementen door het blok zijn gegaan. In dit geval is ‘som’ wat we een accumulator noemen — omdat het de waarden accumuleert. De retourwaarde is de som van alle elementen in de collectie.

deze methode is merkwaardig omdat u er ook een standaardwaarde aan kunt geven voor de accumulator. Zie hieronder:

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

Hier geeft u de methode een startwaarde voor de accumulator, aangezien ik deze nul heb gegeven, voegt de methode het eerste element van de verzameling toe aan nul voordat u verder gaat met de toevoeging van het tweede en derde element in de verzameling.

nu dat we weten hoe we waarden uit collecties moeten toevoegen… Laten we de andere toepassingen van #inject onderzoeken.

bouwen van Hashes:

#injecteren kan zeer krachtig zijn buiten het optellen van waarden bij elkaar. Laten we zeggen dat je gegevens hebt of een retourwaarde die een array van arrays is die sleutels en waarden bevatten (d.w.z. , ]). Je zult waarschijnlijk willen dat deze sleutel zijn: waardeparen in een hash. Injecteren kan u zeer snel en elegant helpen om dat voor elkaar te krijgen.

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

in dit voorbeeld beginnen we met een array van arrays die sleutel-en waardeparen bevatten. Wanneer we injecteren en doorgeven in een argument van een lege hash, die zal fungeren als de accumulator (of in dit geval ‘resultaat’). Vervolgens herhaalt de methode elk element en injecteert het in de hash met behulp van het blok. Het blok wijst het sleutelelement, dat als eerste komt, toe als een sleutel in de nieuwe hash en stelt de waarde gelijk aan het tweede element in de geneste array. Een ander ding om hier op te merken is dat de return waarde van inject het volgende resultaat is (typisch de som van gehele getallen). Omdat we onze hash willen, moeten we expliciet De ‘resultaat’ hash retourneren.

bovendien kan inject worden gebruikt om gegevenstypen te converteren met behulp van enkele andere coole methoden — zelfs terwijl het een nieuwe hash bouwt!

, ].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"=>}

injecteren houdt echter niet op. Het kan ook filteren en bouwen van een nieuwe array!

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

Hier zijn we passeren het injecteren van een initiële waarde van een lege array. Het eerste element tussen de / / zal altijd het ‘resultaat’ of de accumulator in het blok zijn. Dus, zodra het resultaat gelijk is aan een lege array, kunnen we elk element dat onze filter passeert, in dit geval als het element groter is dan 9 scheppen. Nogmaals, aangezien injecteer de retourwaarde het volgende resultaat is, moeten we het resultaat expliciet retourneren.