98 votes

Array # each vs. Array # map

 hash = { "d" => [11, 22], "f" => [33, 44, 55] }

# case 1
hash.map {|k,vs| vs.map {|v| "#{k}:#{v}"}}.join(",")
=> "d:11,d:22,f:33,f:44,f:55"

# case 2
hash.map {|k,vs| vs.each {|v| "#{k}:#{v}"}}.join(",")
=> "11,22,33,44,55"
 

la seule différence est que le cas 1 utilise vs.map , le cas 2 utilise vs.each .

Que s'est-il passé ici?

186voto

Olives Points 3925

Array#map est une collection de tout ce qui est retourné dans l'bloqué pour chaque élément.

Array#each d'exécuter le bloc de code pour chaque élément, puis retourne la liste elle-même.

Si vous exécutez ce pour un particulier vs

vs.each {|v| "#{k}:#{v}"}

Vous remarquerez que vous ne trouverez que des vs de retour. La chaîne à l'intérieur de chaque bloc est exécuté, mais n'a pas d'effets secondaires, donc il n'a pas vraiment d'importance.

Fondamentalement, le cas 2 est en train de faire:

hash.map{|k,vs| vs }.join(",")

35voto

DigitalRoss Points 80400

Les effets secondaires sont les mêmes qui consiste à ajouter de la confusion à votre reverse engineering.

Oui, les deux itérer sur le tableau (en fait, sur tout ce qui se mélange dans Énumérable), mais la carte sera de retour un Tableau composé du bloc des résultats alors que chacun va juste retourner le Tableau d'origine.

La valeur de retour de chacun est rarement utilisé dans le code Ruby, mais la carte est l'un des plus importants outils fonctionnels.

BTW, vous pouvez peut-être avoir du mal à trouver de la documentation, car la carte est une méthode d' Énumération alors que chacun (une méthode requise par l' Énumérable module) est une méthode dans le Tableau.

Comme un jeu remarque: la carte de la mise en œuvre est basée sur chaque.

14voto

Rima Points 51

Voici une démonstration rapide de quoi carte diffère de chacun

Vous voyez que la carte retourne tandis que chacun parcourt juste, mais retourne le tableau d’origine : .

Donc chacun est utilisé pour traiter un tableau et carte sert à faire quelque chose avec un tableau transformé.

4voto

pastullo Points 377

.each retourne le même tableau que celui que vous aviez initialement fourni:

 [1,2,3].each { |i| i + 1 }
#=> [1,2,3]
 

.map renvoie un nouveau tableau à partir des résultats de chaque appel de bloc:

 [1,2,3].map { |i| i + 1 }
#=> [2,3,4]
 

0voto

sawa Points 62592

lorsque vous utilisez la carte vers un hachage, il jette implicitement le hachage sur un tableau, de sorte que vous avez

 [["d", [11, 22]], ["f", [33, 44, 55]]]
 

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

 [[11, 22], [33, 44, 55]]
 

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