2009-11-21 7 views
74

Estoy aprendiendo Ruby, así que le pido disculpas si esto es demasiado nuevo para mí por aquí, pero no puedo descifrarlo del libro de los picos (probablemente no lo lea con cuidado). De todos modos, si tengo una matriz de este modo:¿Cómo modifico una matriz mientras estoy iterando sobre ella en Ruby?

arr = [1,2,3,4,5] 

... y quiero, por ejemplo, multiplicar cada valor de la matriz por 3, he calculado que hacer lo siguiente:

arr.each {|item| item *= 3} 

... no obtendré lo que quiero (y entiendo por qué, no estoy modificando la matriz en sí).

Lo que no entiendo es cómo modificar la matriz original desde dentro del bloque de código después del iterador. Estoy seguro de que esto es muy fácil.

Respuesta

118

Uso map para crear una nueva matriz de la anterior:

arr2 = arr.map {|item| item * 3} 

Uso map! a modificar la matriz en su lugar:

arr.map! {|item| item * 3} 

ver su funcionamiento en línea: ideone

+2

Si realmente necesita modificar cada elemento, usar el mapa sería definitivamente más elegante, en mi humilde opinión. – fresskoma

+2

¡Y si quiere modificar la matriz en sí, use map! en su lugar –

16

Para modifique directamente la matriz, use arr.map! {|item| item*3}. Para crear una nueva matriz basada en la original (que a menudo es preferible), use arr.map {|item| item*3}. De hecho, siempre lo pienso dos veces antes de usar each, porque generalmente hay una función de orden superior como map, select o inject que hace lo que quiero.

+0

¿Qué sucede si no desea realizar una operación de enumeración? ¿Qué sucede si solo quieres hacer algo como 'arr.map! {Destructive_op}' para cambiar permanentemente 'arr'? –

+1

@TrevorAlexander: No estoy seguro de lo que quieres decir. Puede valer la pena preguntar como una pregunta real con detalles y otras cosas. – Chuck

+0

Tendré que pensarlo. Aparte de la modificación de elementos muy estrecha, ¿qué operaciones destructivas en las estructuras no son enumerables? –

5
arr.collect! {|item| item * 3} 
Cuestiones relacionadas