[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 ?
[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 ?
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
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.
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.
[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 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.