2013-03-30 4 views
12

Ich mag dieseWie kann ich über einen umgekehrten Bereich mit einem bestimmten Schritt in Ruby iterieren?

(0..10).step(2){|v| puts v} 

laufen kann aber, da umgekehrter Bereich leeren Bereich gleich ist, kann ich nicht auf diese Weise iterieren

(10..0).step(2){|v| puts v} 

es verdient mir nichts. Natürlich kann ich diese rückwärts wie iterieren

10.downto(0){|v| puts v} 

aber downto Methode erlaubt mir nicht, außer Standard anderen Schritt zu setzen 1. Es ist etwas sehr einfach, so nehme ich es eine eingebaute Möglichkeit, sein sollte, Mach das, was ich nicht weiß.

+0

Sie können wie etwas tun '(0..10) .step (2) .reverse ", aber Sie müssen möglicherweise eine Logik hinzufügen, falls die Ausgabe von' (10..0) .step (2) 'anders ist. – jvnill

+0

'(0..10) .step (2) .reverse' ist nicht gültig; Ruby sagt: 'NoMethodError: undefinierte Methode 'reverse' für # '. –

Antwort

20

Warum Sie nicht verwenden Numeric#step:

Aus der Dokumentation:

Invokes block with the sequence of numbers starting at num, incremented by step (default 1) on each call. The loop finishes when the value to be passed to the block is greater than limit (if step is positive) or less than limit (if step is negative). If all the arguments are integers, the loop operates using an integer counter. If any of the arguments are floating point numbers, all are converted to floats, and the loop is executed floor(n + n*epsilon)+ 1 times, where n = (limit - num)/step. Otherwise, the loop starts at num, uses either the < or > operator to compare the counter against limit, and increments itself using the + operator.

 
irb(main):001:0> 10.step(0, -2) { |i| puts i } 
10 
8 
6 
4 
2 
0 
+1

Nizza. Ich fand auch einen anderen Weg, weniger elegant: (-10..0) .step (2) {| v | setzt -1 * v} – user1887348

4

es ist sehr einfach zu emulieren step durch Überspringen von Werten, die Sie nicht benötigen. Etwas wie folgt aus:

10.downto(0).each_with_index do |x, idx| 
    next if idx % 3 != 0 # every third element 
    puts x 
end 
# >> 10 
# >> 7 
# >> 4 
# >> 1 
+0

Wenn Sie Elemente in jeder Anweisung bedingungslos überspringen, tun Sie es falsch und sollten auswählen: '10.downto (0) .select.with_index {| x, idx | idx% 3 == 0} .each {| x | puts x} ' – SamStephens

+0

@SamStephens: das ist umstritten. –

+0

Alles ist, aber ich werde behaupten, dass wenn Sie die Funktionen der funktionalen Sammlung von Ruby verwenden, Sie sie konsistent verwenden sollten, anstatt funktionale und imperative Stile zu mischen. – SamStephens

Verwandte Themen