2012-03-06 19 views
22

Duplicar posible:
Ruby - What is the difference between map, each and collect?diferencia entre el mapa y cada

me he mirado en Rubí-Doc también, pero no puedo entender la diferencia entre

map 
each 

iteradores. Sería genial si pudieras dar un ejemplo y explicarlo.

+0

... y además de las respuestas de Andrew y Bryan agrego que hay otro método llamado * collect * que es exactamente igual a * map *;) –

+0

Yup, 'map' &' collect' son equivalentes. Aunque nunca me gustó el nombre "recoger", ya que no creo que realmente describa lo que hace muy bien. –

Respuesta

64

each simplemente itera sobre el enumerable dado, ejecutando el bloque para cada valor. Se descarta el valor de retorno del bloque, y cada uno simplemente devuelve el objeto original se llamaba en:

[1, 2, 3].each do |i| 
    i + 1 
end # => [1, 2, 3] 

Esto es simplemente una manera más agradable, más universal de hacer un tradicional bucle de iteración for y each es mucho prefirió más de for bucles en Ruby (de hecho, no creo que alguna vez haya usado un bucle for en Ruby).

map, sin embargo, itera sobre cada elemento, utilizando el valor de retorno del bloque para rellenar una nueva matriz en cada índice respectivo y regresar esa nueva matriz:

[1, 2, 3].map do |i| 
    i + 1 
end # => [2, 3, 4] 

por lo que "mapas" que cada elemento uno nuevo usando el bloque dado, de ahí el nombre "mapa". Tenga en cuenta que ni each ni map modifican la colección original.

+2

Vale la pena destacar que no establece ningún valor en la colección * original *; solo en la copia devuelta – SasQ

+0

_ "establece el elemento actual que se itera sobre el valor de retorno" _ suena como si el elemento actual estuviera siendo reemplazado por el valor del bloque.Y _ "con esos cambios" _ enfatiza que algo está siendo cambiado. Esa sería una buena explicación para 'Array # map!' (Con bang). 'map' por otro lado (ambos,' Enumerable # map' y 'Array # map') devuelve una nueva matriz (siempre es una matriz, independientemente del receptor dado) que contiene los valores devueltos por el bloque sin cambiar el receptor. – Stefan

+1

@Stefan Puedo ver la confusión, con suerte la actualización aclara un poco las cosas (¡esto fue escrito hace * mucho * tiempo!). –

7

each devuelve el objeto original. Se usa para ejecutar una operación utilizando cada elemento de una matriz sin recopilar ninguno de los resultados. Por ejemplo, si desea imprimir una lista de números, es posible hacer algo como esto:

arr = [1, 2, 3, 4] 
arr.each { |n| puts n } 

Ahora, que puts método anterior devuelve realmente nil. Algunas personas no lo saben, pero de todos modos no importa mucho; no hay ninguna razón real para recoger ese valor (si se quería convertir arr en cadenas, usted debe utilizar arr.map(&:to_s) o arr.map { |n| n.to_s }.


map devuelve los resultados de la cuadra se pasa a ella. Es una gran manera de ejecute una operación en cada elemento de una matriz y recupere los resultados. Si desea multiplicar cada elemento de una matriz por 2, esta es la elección natural. Como extra, puede modificar el objeto original utilizando map!. Por ejemplo :

arr = [1, 2, 3, 4] 
arr.map! { |n| n * 2} 
# => [2, 4, 6, 8] 
Cuestiones relacionadas