Lassen Sie uns ein Beispiel versuchen.
numbers = [ 3, 1, 4, 1, 5, 9 ]
sum = numbers.inject(0) do |prefix_sum, number|
prefix_sum + number
end
#inject
nimmt ein Argument und einen Block. Der Block sollte zwei Werte annehmen und einen neuen Wert zurückgeben. Im obigen Beispiel lautet das Argument #inject
0
und der Block lautet do |prefix_sum, number| prefix_sum + number end
. Die Werte, die an den Block übergeben werden, werden zwischen den beiden |
Markern benannt: prefix_sum
und number
.
Jeder Wert des aufzählbaren #inject
wurde aufgerufen, der wiederum als zweiter Wert an den Block übergeben wird. In diesem Beispiel wird number
3
sein, dann 1
, dann 4
, dann 1
, dann 5
, dann schließlich 9
. In diesem Beispiel wird der Block sechsmal aufgerufen. einmal für jede Position in numbers
.
Der erste an einen Block (hier prefix_sum
) übergebene Wert wird normalerweise als Akku bezeichnet. Sein Anfangswert, der Wert, der beim ersten Aufruf des Blocks von #inject
verwendet wird, wird durch das Argument gesetzt, das an #inject
übergeben wird (in diesem Beispiel 0
). Der Rückgabewert des Bausteins bestimmt den Wert des Akkumulators (prefix_sum
) für den nächsten Aufruf des Bausteins.
Wenn keine weiteren Elemente zu verarbeiten sind, wird der Wert des Akkumulators zurückgegeben (und hier in sum
gespeichert).
lässt So Spaziergang durch sie:
#inject
empfängt 0
und unserem Block.
#inject
ruft unseren Block, Binde- prefix_sum
-0
(die anfängliche Akkumulatorwert) und number
-3
(der erste Array-Wert).
- unser Block berechnet
0+3
als 3
und gibt es zurück.
#inject
ruft unseren Block, Binde- prefix_sum
zu 3
(der zurückgegebene Wert) und number
-1
(der zweite Array-Wert)
- unser Block berechnet als
3+1
4
und gibt ihn zurück.
#inject
ruft unseren Block, Binde- prefix_sum
zu 4
(der zurückgegebene Wert) und number
zu 4
(der dritten Array-Wert)
- unser Block berechnet als
4+4
8
und gibt ihn zurück.
#inject
ruft unseren Block, Binde- prefix_sum
zu 8
(der zurückgegebene Wert) und number
-1
(der vierte Arraywert)
- unser Block berechnet als
8+1
9
und gibt ihn zurück.
#inject
ruft unseren Block, Binde- prefix_sum
zu 9
(der zurückgegebene Wert) und number
-5
(der fünfte Array-Wert)
- unser Block berechnet als
9+5
14
und gibt ihn zurück.
#inject
ruft unseren Block, Binde- prefix_sum
zu 14
(der zurückgegebene Wert) und number
-9
(der sechste Feldwert)
- unser Block berechnet als
14+9
23
und gibt ihn zurück.
- Da es keine Array-Elemente mehr gibt, gibt
#inject
23
zurück, und wir binden sum
an diesen Wert.
Sie können auf einer Liste von Elementen eine Operation bei Inject aussehen wie das einklammern, in diesem Beispiel caluculating:
((((((0 + 3) + 1) + 4) + 1) + 5) + 9)
Diese Sie alle Funktionen übernehmen kann, die normalerweise arbeitet nur auf einem Paar von Argumenten, und wenden Sie es auf eine Liste an.
Haben Sie ein besonderes Beispiel Sie‘ D wie erklären? Kjfletchs Antwort ist gut. Wenn Sie Ihre Frage etwas erweitern, können die Leute vielleicht mehr Details liefern. – mikej