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 ?

0voto

Wagner Braga Points 361

Un scénario courant, lorsqu'on utilise une collection, quelle qu'elle soit, consiste à effectuer un seul type d'opération avec tous les éléments et à collecter le résultat.

Par exemple, une fonction sum(array) peut vouloir additionner tous les éléments passés dans le tableau et renvoyer le résultat.

Une abstraction généralisée de la même fonctionnalité est fournie en Ruby sous le nom de reduce (inject est un alias). En d'autres termes, ces méthodes itèrent sur une collection et accumulent la valeur d'une opération sur des éléments dans une valeur de base en utilisant un opérateur et renvoient cette valeur de base à la fin.

Prenons un exemple pour mieux comprendre.

>>> (5..10).inject(1) {|product, n| product * n }
=> 151200

Dans l'exemple ci-dessus, nous avons les éléments suivants : une valeur de base 1, un tableau (5..10), et un bloc avec des expressions indiquant comment ajouter la valeur calculée à la valeur de base (c'est-à-dire multiplier l'élément du tableau par le produit, où le produit est initialisé avec la valeur de base).

L'exécution suit donc quelque chose comme ça :

# loop 1
n = 1
product = 1
return value = 1*1

# loop 2
n = 2
product = 1
return value = 1*2

n = 3
product = 2
return value = 2*3

.. Comme vous pouvez le remarquer, la valeur de base est continuellement mise à jour alors que l'expression boucle sur les éléments du conteneur, retournant ainsi la valeur finale de la valeur de base comme résultat.

-1voto

Said Maadan Points 37

C'est la même chose que ça :

[1,2,3,4].inject(:+)
=> 10

-1voto

Nick Points 13

C'est juste reduce o fold si vous êtes familier avec d'autres langues.

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