148 votes

Besoin d'une explication simple de la méthode d'injection

[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10

Je regarde ce code mais mon cerveau n'enregistre pas comment le nombre 10 peut devenir le résultat. Quelqu'un pourrait-il m'expliquer ce qui se passe ici ?

14voto

Stuart G Points 21

Le nombre que vous mettez à l'intérieur de votre () d'injecteur représente un point de départ, il peut être 0 ou 1000. À l'intérieur des tuyaux, vous avez deux caractères de remplacement |x, y|. x = le nombre que vous avez mis dans le .inject('x'), et le second représente chaque itération de votre objet.

[1, 2, 3, 4].inject(5) { |result, element| result + element } # => 15

1 + 5 = 6 2 + 6 = 8 3 + 8 = 11 11 + 4 = 15

6voto

Sam Hoice Points 1766

Inject applique le bloc

result + element

à chaque élément du tableau. Pour l'élément suivant ("element"), la valeur renvoyée par le bloc est "result". De la manière dont vous l'avez appelé (avec un paramètre), le "résultat" commence par la valeur de ce paramètre. L'effet est donc d'additionner les éléments.

6voto

IAmNaN Points 2713

tldr ; inject diffère de map d'une manière importante : inject renvoie la valeur de la dernière exécution du bloc alors que map retourne le tableau sur lequel il a été itéré.

Plus que cela la valeur de chaque exécution de bloc est transmise à l'exécution suivante via le premier paramètre ( result dans ce cas) et vous pouvez initialiser cette valeur (l'élément (0) partie).

Votre exemple ci-dessus pourrait être écrit en utilisant map comme ça :

result = 0 # initialize result
[1, 2, 3, 4].map { |element| result += element }
# result => 10

Même effet mais inject est plus concise ici.

Vous constaterez souvent qu'une mission se déroule dans le cadre de la map alors que l'évaluation se fait dans le bloc inject bloc.

Le choix de la méthode dépend de la portée que vous voulez donner à votre projet. result . Lorsqu'il s'agit de no l'utiliser serait quelque chose comme ça :

result = [1, 2, 3, 4].inject(0) { |x, element| x + element }

Vous pourriez vous dire : "Regardez-moi, je viens de combiner tout ça en une seule ligne", mais vous avez aussi alloué temporairement de la mémoire pour x comme une variable scratch qui n'était pas nécessaire puisque vous aviez déjà result pour travailler avec.

4voto

Fred Willmore Points 180
[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10

est équivalent à ce qui suit :

def my_function(r, e)
  r+e
end

a = [1, 2, 3, 4]
result = 0

a.each do |value|
  result = my_function(result, value)
end

3voto

Maddie Points 83

[1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10

En clair, vous allez parcourir (itérer) ce tableau ( [1,2,3,4] ). Vous allez itérer dans ce tableau 4 fois, car il y a 4 éléments (1, 2, 3, et 4). La méthode inject a 1 argument (le nombre 0), et vous allez ajouter cet argument au 1er élément (0 + 1. Cela fait 1). 1 est enregistré dans le "résultat". Ensuite, vous ajoutez ce résultat (qui est 1) à l'élément suivant (1 + 2. Ce qui donne 3). Ce site sera maintenant enregistré comme résultat. Continuez : 3 + 3 égale 6. Et enfin, 6 + 4 égale 10.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X