Méthode d’injection: Expliqué
Aujourd’hui, nous examinons la méthode d’injection de Ruby (#inject). Comme tous ceux qui sont assez loin dans leur voyage pour en savoir plus sur le codage, vous savez que les langues sont remplies de méthodes et de fonctions déroutantes et géniales. Récemment, je suis tombé sur l’une de ces méthodes déroutantes, et comme j’ai appris, des méthodes impressionnantes, injectez. J’essayais de additionner un tableau d’entiers et je pensais à tort que ruby avait une méthode native #sum, mais pas une telle chance. Donc, je suis arrivé à googler et j’ai trouvé #inject.
La méthode #inject agit de la même manière que la méthode #reduce, et elles sont considérées comme des alias. Ces méthodes énumératrices peuvent prendre une plage ou un tableau de nombres et peuvent éventuellement recevoir un bloc. Lorsqu’elle est appelée, la méthode inject transmettra chaque élément et l’accumulera séquentiellement.
.inject(:+) => (((3 + 6) + 10) + 13) => 32
OU
.inject {|sum, number| sum + number} =>|3, 6| 3 + 6 => 9
=>|9, 10| 9 + 10 =>19
Pour décomposer cela encore plus loin, inject prend le premier élément de votre collection et l’utilise comme « somme » de base. Il prend ensuite l’élément suivant (ou le deuxième élément du tableau), puis les ajoute ensemble. La méthode attribue ensuite ce résultat à la « somme » et ajoute l’élément suivant de la collection jusqu’à ce que tous les éléments aient été passés à travers le bloc. Dans ce cas’ « somme » est ce que nous appelons un accumulateur — car il accumule les valeurs. La valeur de retour sera la somme de tous les éléments de la collection.
Cette méthode est curieuse car vous pouvez également lui transmettre une valeur par défaut pour l’accumulateur. Voir ci-dessous:
.inject(0, :+) => 32.inject(0) {|sum, number| sum + number} => 19
Ici, vous donnez à la méthode une valeur de départ pour l’accumulateur, puisque je l’ai passé à zéro, la méthode ajoutera le premier élément de la collection à zéro avant de passer à l’ajout des deuxième et troisième éléments de la collection.
Maintenant que nous savons comment ajouter des valeurs à partir de collections explore Explorons les autres applications de #inject.
Construire des hachages:
#Inject peut être très puissant en dehors de l’ajout de valeurs ensemble. Disons que vous avez des données ou une valeur de retour qui est un tableau de tableaux contenant des clés et des valeurs (c’est-à-dire ]). Vous voudrez probablement que ceux-ci soient des paires de valeurs clés dans un hachage. Inject peut très rapidement et élégamment vous aider à y parvenir.
, ].inject({}) do |result, element|
result = element.last
result
end
#=> {:student=>"Terrance Koar", :course=>"Web Dev"}
Dans cet exemple, nous commençons avec un tableau de tableaux contenant des paires de clés et de valeurs. Lorsque nous appelons inject et transmettons un argument d’un hachage vide, qui agira comme l’accumulateur (ou dans ce cas ‘result’). Ensuite, la méthode parcourt chaque élément et l’injecte dans le hachage à l’aide du bloc fourni. Le bloc attribue l’élément clé, qui vient en premier, en tant que clé dans le nouveau hachage et définit la valeur égale au deuxième élément du tableau imbriqué. Une autre chose à noter ici est que la valeur de retour d’inject est le résultat suivant (généralement la somme des entiers). Puisque nous voulons notre hachage, nous devons renvoyer explicitement le hachage « résultat ».
De plus, inject peut être utilisé pour convertir des types de données à l’aide d’autres méthodes intéressantes — même pendant la construction d’un nouveau hachage!
, ].inject({}) do |result, element|
result = element.last.upcase
result
end
# => {"student"=>"TERRANCE KOAR", "course"=>"WEB DEV"}OR, ].inject({}) do |result, element|
result = element.last.split
result
end# => {"student"=>, "course"=>}
Inject ne s’arrête pas là cependant. Il peut également filtrer et créer un nouveau tableau!
.inject() do |result, element|
result << element.to_s if element > 9
result
end# =>
Nous passons ici à injecter une valeur initiale d’un tableau vide. Le premier élément entre le // sera toujours le « résultat » ou l’accumulateur dans le bloc. Ainsi, une fois que result est défini égal à un tableau vide, nous pouvons pelleter n’importe quel élément qui passe notre filtre, dans ce cas si l’élément est supérieur à 9. Encore une fois, puisque la valeur de retour d’inject est le résultat suivant, nous devons renvoyer explicitement le résultat.