Essayons un exemple.
numbers = [ 3, 1, 4, 1, 5, 9 ]
sum = numbers.inject(0) do |prefix_sum, number|
prefix_sum + number
end
#inject
prend un argument et un bloc. Le bloc doit prendre deux valeurs et renvoyer une nouvelle valeur. Dans l'exemple ci-dessus, l'argument #inject
est 0
et le bloc est do |prefix_sum, number| prefix_sum + number end
. Les valeurs qui seront transmises au bloc sont nommées entre les deux marqueurs |
: prefix_sum
et number
.
Chaque valeur de l'élément énumérable #inject
est transmise comme seconde valeur au bloc à son tour. Dans cet exemple number
sera 3
, puis 1
, puis 4
, puis 1
, puis 5
, puis finalement 9
. Donc, dans cet exemple, le bloc sera invoqué six fois; une fois pour chaque position dans numbers
.
La première valeur passée à un bloc (ici nommé prefix_sum
) est généralement appelée accumulateur . Sa valeur initiale, la valeur utilisée la première fois que le bloc est appelé par #inject
, est définie par l'argument passé à #inject
(dans cet exemple, 0
). La valeur de retour du bloc détermine la valeur de l'accumulateur (prefix_sum
) pour l'appel suivant du bloc.
Lorsqu'il n'y a plus d'éléments à traiter, la valeur de l'accumulateur est renvoyée (et stockée ici dans sum
).
permet donc marcher à travers elle:
#inject
reçoit 0
et notre bloc.
#inject
invoque notre bloc, la liaison prefix_sum
-0
(la valeur initiale de l'accumulateur) et number
-3
(la première valeur de tableau). Notre bloc calcule 0+3
comme 3
et le renvoie.
#inject
invoque notre bloc, la liaison prefix_sum
-3
(la valeur retournée) et number
-1
(la seconde valeur de tableau)
- notre bloc calcule
3+1
comme 4
et le renvoie.
#inject
invoque notre bloc, la liaison prefix_sum
-4
(la valeur retournée) et number
-4
(la troisième valeur de tableau)
- notre bloc calcule
4+4
comme 8
et le renvoie.
#inject
invoque notre bloc, la liaison prefix_sum
-8
(la valeur retournée) et number
-1
(la quatrième valeur de tableau)
- notre bloc calcule
8+1
comme 9
et le renvoie.
#inject
invoque notre bloc, la liaison prefix_sum
-9
(la valeur retournée) et number
-5
(la cinquième valeur de tableau)
- notre bloc calcule
9+5
comme 14
et le renvoie.
#inject
notre bloc invoque, la liaison prefix_sum
-14
(la valeur retournée) et number
-9
(la sixième valeur de tableau)
- notre bloc calcule
14+9
comme 23
et le retourne.
- car il n'y a plus d'éléments de tableau,
#inject
renvoie 23
et nous lier sum
pour être cette valeur.
Vous pouvez regarder Injecter parenthèse une opération sur une liste d'éléments, dans cet exemple, caluculating:
((((((0 + 3) + 1) + 4) + 1) + 5) + 9)
Cela vous permet de prendre toute opération qui fonctionne normalement sur une paire d'arguments, et l'appliquer à une liste.
Avez-vous un exemple particulier que vous » d aimer expliquer? La réponse de kjfletch est bonne si vous développez votre question un peu les gens pourraient être en mesure de fournir plus de détails. – mikej