2012-06-01 10 views
8

Estoy intentando invertir Enumerable (como Array) sin usar el método reverse, pero usando el iterador reverse_each.Invertir enumerable en Ruby

yo esperaba, que es lo suficientemente siguiente código:

p [1,2,3].reverse_each {|v| v } 

sin embargo, el bloque no vuelve matriz en Invertida orded. Por supuesto que podría escribir

[1,2,3].reverse_each {|v| p v } 

pero me gustaría recoger los artículos de la primera manera. ¿Cuál es la fuente si este comportamiento y cómo debo escribir mi expresión para cumplir el requisito?

Respuesta

19

De 1.8.7, Enumerable#each_* métodos return an enumerator cuando no se proporciona ningún bloque. Eso es bastante bueno: muchos métodos originalmente imperativos ahora se pueden usar en forma funcional como expresiones.

lo tanto, si se quiere recoger elementos, utilice Enumerable#map en ese empadronador:

reversed_values = [1, 2, 3].reverse_each.map { |x| 2*x } 
#=> [6, 4, 2] 
+0

'reverse_each' súper práctico! ¡Gracias! –

-1

Otro método sería [1, 2, 3].reverse_each.to_a

+0

Llamas a to_a en una matriz ... – askl56

+0

Vaya, lo edité a lo que me refería – Dorian

-1

(1..3) .reverse_each {| v | pv}

produce:

Se construye una matriz temporal y atraviesa que matriz en orden inverso, pero no devolver la copia inversa de la colección transformado

Si ningún bloque se da, se devuelve un enumerador en su lugar.

Pero el método mapa de Ruby

Devuelve una nueva matriz con los resultados de la ejecución del bloque una vez para cada elemento de la enumeración.

p [1,2,3] .reverse_each.map {| v | v}

reverse_each - actuará como un iterador

mapa - formará un nuevo conjunto de recogida