Articles

Injizieren Methode: Erklärt

Heute werfen wir einen Blick auf Rubys Inject-Methode (#inject). Als jeder, der weit genug auf seiner Reise ist, um mehr über das Codieren zu erfahren, wissen Sie, dass Sprachen voller verwirrender, großartiger Methoden und Funktionen sind. Kürzlich bin ich auf eine dieser verwirrenden und, wie ich gelernt habe, großartigen Methoden gestoßen. Ich habe versucht, ein Array von ganzen Zahlen zu summieren, und dachte fälschlicherweise, Ruby hätte eine native #sum Methode, aber kein solches Glück. Also habe ich gegoogelt und #inject gefunden.

Die #inject-Methode verhält sich genauso wie die #reduce-Methode, und sie werden als Aliase betrachtet. Diese Enumeratormethoden können einen Bereich oder ein Array von Zahlen annehmen und optional einen Block empfangen. Wenn sie aufgerufen wird, übergibt die inject-Methode jedes Element und akkumuliert jedes nacheinander.

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

ODER

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

Um dies noch weiter aufzuschlüsseln, nimmt inject das erste Element in Ihrer Sammlung und verwendet es als Basis-Summe. Es nimmt dann das nächste Element (oder das zweite Element im Array) und fügt sie dann zusammen. Die Methode weist dieses Ergebnis dann der ‚Summe‘ zu und fügt das nächste Element in der Sammlung hinzu, bis alle Elemente den Block durchlaufen haben. In diesem Fall ist ’sum‘ das, was wir einen Akkumulator nennen — da er die Werte akkumuliert. Der Rückgabewert ist die Summe aller Elemente in der Auflistung.

Diese Methode ist merkwürdig, da Sie ihr auch einen Standardwert für den Akkumulator übergeben können. Siehe unten:

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

Hier geben Sie der Methode einen Startwert für den Akkumulator, da ich ihn auf Null übergeben habe, fügt die Methode das erste Element der Sammlung zu Null hinzu, bevor Sie mit dem Hinzufügen des zweiten und dritten Elements in der Sammlung fortfahren.

Nun, da wir wissen, wie man Werte von Sammlungen … Lassen Sie uns die anderen Anwendungen von #inject erkunden.

Hashes erstellen:

#Inject kann außerhalb des Addierens von Werten sehr mächtig sein. Angenommen, Sie haben Daten oder einen Rückgabewert, der ein Array von Arrays ist, die Schlüssel und Werte enthalten (dh ] ). Sie werden höchstwahrscheinlich wollen, dass diese Schlüssel: Wert-Paare in einem Hash sind. Wir können Ihnen sehr schnell und elegant dabei helfen.

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

In diesem Beispiel beginnen wir mit einem Array von Arrays, die Schlüssel- und Wertepaare enthalten. Wenn wir inject aufrufen und ein Argument eines leeren Hash übergeben, der als Akkumulator (oder in diesem Fall ‚result‘) fungiert. Anschließend durchläuft die Methode jedes Element und injiziert es mithilfe des bereitgestellten Blocks in den Hash. Der Block weist das Schlüsselelement, das zuerst kommt, als Schlüssel im neuen Hash zu und setzt den Wert gleich dem zweiten Element im verschachtelten Array. Eine andere Sache, die hier zu beachten ist, ist, dass der Rückgabewert von inject das nächste Ergebnis ist (normalerweise die Summe der ganzen Zahlen). Da wir unseren Hash wollen, müssen wir explizit den ‚Ergebnis‘-Hash zurückgeben.

Darüber hinaus kann inject verwendet werden, um Datentypen mit Hilfe einiger anderer cooler Methoden zu konvertieren – sogar während ein neuer Hash erstellt wird!

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

Das hört hier aber nicht auf. Es kann auch filtern und ein neues Array erstellen!

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

Hier übergeben wir inject einen Anfangswert eines leeren Arrays. Das erste Element zwischen dem |/ ist immer das ‚Ergebnis‘ oder der Akkumulator im Block. Sobald das Ergebnis also auf ein leeres Array gesetzt ist, können wir jedes Element eingeben, das unseren Filter passiert, in diesem Fall, wenn das Element größer als 9 ist. Da der Rückgabewert von inject das nächste Ergebnis ist, müssen wir das Ergebnis explizit zurückgeben.