index create array ruby arrays enumerable

create - ruby hash map



Array#each vs. Array#map (6)

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 única diferencia es que el caso 1 usa vs.map , el caso 2 usa vs.each .

¿Lo que pasó aquí?


Aquí hay una demostración rápida de cómo el mapa difiere de cada

a = ["a", "b", "c"]; #Array.map p a.map {|item| "map_" + item} #prints ["map_a", "map_b", "map_c"] #Array.each p a.each {|item| "map_" + item} #prints ["a", "b", "c"]

Verá que el mapa devuelve ["map_a", "map_b", "map_c"] mientras que cada uno simplemente itera 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.


Array # cada método devuelve el mismo array

a = [1,2,3,4,5] a.object_id #70284994490700 b = a.each {|n| n + 2} p b #[1,2,3,4,5] b.object_id #70284994490700 <<--- it''s the same as a

El método de matriz # map devuelve una nueva matriz

c = [1,2,3,4,5] c.object_id #70219117705860 d = c.map {|n| n + 2} p d #[3,4,5,6,7] d.object_id #70284994343620 <<---- it''s different than c


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 map devolverá una matriz compuesta de los resultados del bloque, mientras que each solo devolverá la matriz original.

El valor de retorno de each es solo el conjunto original y rara vez se utiliza en el código de Ruby, pero el map es una de las herramientas funcionales más importantes .

Lo que hace el map es devolver una matriz que contiene los resultados del bloque o el método nombrado que se pasa. Por ejemplo:

2.2.3 :001 > [:how, :now, :brown, :cow].map &:to_s => ["how", "now", "brown", "cow"]

En este caso, no pasé un bloque sino solo un Symbol , sin embargo, class Symbol objetos class Symbol tienen un método to_proc que dará como resultado:

[:how.to_s, :now.to_s, ...]

Por cierto, puede que le cueste encontrar la documentación porque el mapa es un método en Enumerable, mientras que cada uno (el único método requerido por el módulo Enumerable ) es un método en Array .

Como nota trivia: la implementación del mapa se basa en cada uno .


cuando utiliza el mapa en un hash, implícitamente lanza el hash a una matriz, por lo que tiene

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

vs.each {...} solo te 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

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


.each devuelve la misma matriz que proporcionó inicialmente:

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

.map devuelve una nueva matriz de los resultados de cada llamada de bloque:

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


Array#each ejecuta Array#each bloque dado para cada elemento de la matriz y luego devuelve la matriz.

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: supongamos que tiene una matriz definida de la siguiente manera:

arr = ["tokyo", "london", "rio"]

Luego intente ejecutar each :

arr.each { |element| element.capitalize } # => ["tokyo", "london", "rio"]

Tenga en cuenta que el valor de retorno es simplemente el mismo conjunto. El código dentro de 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, al llamar al método de map la matriz se devuelve una nueva matriz cuyos elementos son los valores de retorno de cada ronda de ejecución del bloque de map :

arr.map { |element| element.capitalize } # => ["Tokyo", "London", "Rio"]