Array#each
ejecuta el bloque dado para cada elemento de la matriz, luego devuelve la matriz en sí.
Array#map
también ejecuta el bloque dado para cada elemento de la matriz, pero devuelve una nueva matriz cuyos valores son los valores de retorno de cada iteración del bloque.
Ejemplo: suponga que tiene una matriz definida así:
arr = ["tokyo", "london", "rio"]
Entonces intente ejecutar each
:
arr.each { |element| element.capitalize }
# => ["tokyo", "london", "rio"]
Tenga en cuenta que el valor de retorno es simplemente la misma matriz. El código dentro del each
bloque se ejecuta, pero los valores calculados no se devuelven; y como el código no tiene efectos secundarios, este ejemplo no realiza ningún trabajo útil.
Por el contrario, llamar al map
método de la matriz devuelve una nueva matriz cuyos elementos son los valores de retorno de cada ronda de ejecución del map
bloque:
arr.map { |element| element.capitalize }
# => ["Tokyo", "London", "Rio"]
Los efectos secundarios son los mismos, lo que agrega cierta confusión a su ingeniería inversa.
Sí, ambos iteran sobre la matriz (en realidad, sobre cualquier cosa que se mezcle en Enumerable ) pero el mapa devolverá una matriz compuesta por los resultados del bloque, mientras que cada una simplemente devolverá la matriz original.
El valor de retorno de cada uno es solo la matriz original y rara vez se usa en el código Ruby, pero el mapa es una de las herramientas funcionales más importantes .
Lo que
map
hace es devolver una matriz que contiene los resultados del bloque o método nombrado que se pasa. Por ejemplo:En este caso, no pasé un bloque sino solo un
Symbol
, sin embargo, losclass Symbol
objetos tienen unto_proc
método que dará como resultado:Por cierto, es posible que tenga dificultades para encontrar la documentación porque map es un método en Enumerable, mientras que cada (el único método requerido por el módulo Enumerable ) es un método en Array .
Como nota de trivia: la implementación del mapa se basa en cada uno .
fuente
Aquí hay una demostración rápida de cómo se diferencia el mapa de cada uno
Se ve que el mapa rendimientos
["map_a", "map_b", "map_c"]
mientras que cada iteración sólo pero devuelve la matriz original:["a", "b", "c"]
.Entonces, cada uno se usa para procesar una matriz y el mapa se usa para hacer algo con una matriz procesada.
fuente
.each
devuelve la misma matriz que proporcionó inicialmente:.map
devuelve una nueva matriz a partir de los resultados de cada llamada de bloque:fuente
Array # cada método devuelve la misma matriz
El método de mapa de matriz # devuelve una nueva matriz
fuente
cuando usa map to a hash, implícitamente lanza el hash a una matriz, por lo que tiene
frente a cada {...} solo le devuelve la última evaluación, que es [11, 22] para ["d", [11, 22]] y [33, 44, 55] para ["f", [ 33, 44, 55]]. Entonces, antes de la última unión, tienes
fuente
También podría usar
map
con bangmap!
esa matriz de fuente de cambiofuente
each
, que ejecuta el bloque dado y devuelve la matriz original; ymap
, que devuelve una matriz con el resultado de ejecutar el bloque como valores