Pregunta ¿Cómo modifico una matriz mientras estoy iterando sobre ella en Ruby?


Estoy aprendiendo a Ruby, así que me disculpo si esto es demasiado novato por aquí, pero no puedo descifrarlo del libro de los picos (probablemente no lo lea con cuidado). De todos modos, si tengo una matriz como esta:

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

... y quiero, por ejemplo, multiplicar cada valor en la matriz por 3, he resuelto eso haciendo lo siguiente:

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

... no me dará 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.


76
2017-11-21 00:07


origen


Respuestas:


Utilizar map para crear una nueva matriz a partir de la anterior:

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

Utilizar map! para modificar la matriz en su lugar:

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

Véalo trabajar en línea: ideone


121
2017-11-21 00:09



Para modificar 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 eso hace lo que quiero


16
2017-11-21 00:44



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

5
2018-06-06 12:57