2012-06-01 19 views
8

Sto cercando di invertire Enumerable (come Array) senza utilizzare il metodo reverse, ma usando l'iteratore reverse_each.Inversione enumerabile in Ruby

speravo, che seguente codice è sufficiente:

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

tuttavia il blocco non ritorna matrice in invertito orded. Naturalmente potrei scrivere

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

ma mi piacerebbe raccogliere gli oggetti nel primo modo. Qual è la fonte se questo comportamento e come dovrei scrivere la mia espressione per soddisfare i requisiti?

risposta

19

Da 1.8.7, Enumerable#each_* metodi return an enumerator quando non viene fornito alcun blocco. Questo è abbastanza bello: molti metodi originariamente imperativi possono ora essere usati in modo funzionale come espressioni.

Quindi, se si vuole raccogliere oggetti, utilizzare Enumerable#map su quel enumeratore:

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

'reverse_each' eccellente a portata di mano! Grazie! –

-1

Un altro metodo sarebbe [1, 2, 3].reverse_each.to_a

+0

Stai chiamando to_a su un array ... – askl56

+0

Oops, modificato per quello che intendevo – Dorian

-1

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

produce:

costruisce una matrice temporanea e attraversa tale array in ordine inverso, ma non restituiscono la copia inverso della collezione trasformato

Se nessun blocco viene fornito, viene invece restituito un enumeratore.

Ma il metodo mappa di Ruby

Restituisce un nuovo array con i risultati dell'esecuzione del blocco, una volta per ogni elemento enum.

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

reverse_each - agirà come un iteratore

mappa - formeranno una nuova serie di collezione