Array#each
exécute le bloc donné pour chaque élément du tableau, puis renvoie le tableau lui-même.
Array#map
exécute également le bloc donné pour chaque élément du tableau, mais retourne un nouveau tableau dont les valeurs sont les valeurs de retour de chaque itération du bloc.
Exemple: supposons que vous ayez un tableau défini ainsi:
arr = ["tokyo", "london", "rio"]
Ensuite, essayez d'exécuter each
:
arr.each { |element| element.capitalize }
# => ["tokyo", "london", "rio"]
Notez que la valeur de retour est simplement le même tableau. Le code à l'intérieur du each
bloc est exécuté, mais les valeurs calculées ne sont pas renvoyées; et comme le code n'a pas d'effets secondaires, cet exemple n'effectue aucun travail utile.
En revanche, l'appel de la map
méthode du tableau retourne un nouveau tableau dont les éléments sont les valeurs de retour de chaque cycle d'exécution du map
bloc:
arr.map { |element| element.capitalize }
# => ["Tokyo", "London", "Rio"]
Les effets secondaires sont les mêmes, ce qui ajoute une certaine confusion à votre rétro-ingénierie.
Oui, les deux itèrent sur le tableau (en fait, sur tout ce qui se mélange dans Enumerable ) mais la carte renverra un tableau composé des résultats du bloc tandis que chacun retournera simplement le tableau d'origine.
La valeur de retour de chacun est juste le tableau d'origine et est rarement utilisée dans le code Ruby, mais la carte est l'un des outils fonctionnels les plus importants .
Ce qui
map
fait est de retourner un tableau qui contient les résultats du bloc ou de la méthode nommée qui est passé. Par exemple:Dans ce cas, je n'ai pas passé un bloc mais juste un
Symbol
, cependant lesclass Symbol
objets ont uneto_proc
méthode qui se traduira par:BTW, vous pouvez avoir du mal à trouver la documentation car map est une méthode dans Enumerable tandis que chacun (la méthode requise par le module Enumerable ) est une méthode dans Array .
Pour simplifier: l' implémentation de la carte est basée sur chacun .
la source
Voici une démonstration rapide de la différence entre la carte et chacune
Vous voyez que les rendements de carte
["map_a", "map_b", "map_c"]
alors que chaque seulement itère mais renvoie le tableau d' origine:["a", "b", "c"]
.Ainsi, chacun est utilisé pour traiter un tableau et la carte est utilisée pour faire quelque chose avec un tableau traité.
la source
.each
renvoie le même tableau que vous avez fourni initialement:.map
renvoie un nouveau tableau à partir des résultats de chaque appel de bloc:la source
Array # chaque méthode renvoie le même tableau
La méthode Array # map renvoie un nouveau tableau
la source
lorsque vous utilisez map to a hash, il convertit implicitement le hash en un tableau, donc vous avez
vs.each {...} ne vous renvoie que la dernière évaluation, qui est [11, 22] pour ["d", [11, 22]] et [33, 44, 55] pour ["f", [ 33, 44, 55]]. Donc avant la dernière jointure, vous avez
la source
Vous pouvez également utiliser
map
avec bangmap!
ce tableau source de changementla source
each
, qui exécute le bloc donné et renvoie le tableau d'origine; etmap
, qui renvoie un tableau avec le résultat de l'exécution du bloc en tant que valeurs