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.