2012-06-01 5 views
8

Ich versuche, Enumerable (wie Array) ohne Verwendung von reverse Methode, aber mit reverse_each Iterator.Umkehrung aufzählbar in Ruby

Ich hatte gehofft, dass Code finden genug:

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

jedoch der Block nicht in zurückgibt Array orded umgekehrt. Natürlich könnte ich schreiben

aber ich möchte Gegenstände auf die erste Weise sammeln. Was ist die Quelle, wenn dieses Verhalten und wie soll ich meinen Ausdruck schreiben, um die Anforderung zu erfüllen?

Antwort

19

Von 1.8.7, Enumerable#each_* Methoden return an enumerator, wenn kein Block zur Verfügung gestellt wird. Das ist ganz nett: Viele ursprünglich imperative Methoden können nun funktional als Ausdrücke verwendet werden.

Also, wenn Sie Gegenstände sammeln möchten, verwenden Sie Enumerable#map auf diesem enumerator:

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

'reverse_each' super handlich! Vielen Dank! –

-1

Eine andere Methode wäre [1, 2, 3].reverse_each.to_a

+0

Du rufst to_a auf einem Array an ... – askl56

+0

Hoppla, habe es so bearbeitet, wie ich es meinte – Dorian

-1

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

produziert:

es ein temporäres Array Baut und durchquert das Array in umgekehrter Reihenfolge, aber die umgekehrte Kopie der transformierten Sammlung nicht zurück

Wenn kein Block gegeben ist, wird stattdessen ein Enumerator zurückgegeben.

Aber Kartenmethode Rubin

Gibt ein neues Array mit den Ergebnissen der in Enum für jedes Element Block einmal ausgeführt wird.

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

reverse_each - fungiert als Iterator

Karte - wird eine neue Reihe von Sammlung bilden

Verwandte Themen