2010-04-06 11 views
15

wie dieseüber Rubin-Bereich?

range = (0..10) 

wie kann ich Nummer wie diese:

0 5 10 

plus fünf jedes Mal, aber weniger als 10

wenn Bereich = (0..20), dann sollte ich Get this:

0 5 10 15 20 

Antwort

2

Die step Methode in 01 beschriebensollte den Job tun, aber ernsthaft schadetkann die die Lesbarkeit schaden.

Man denke nur an:

(0..20).step(5){|n| print ' first ', n }.each{|n| print ' second ',n } 

Sie mögen denken, dass Schritt (5) Art eine neue Range produziert, wie why_ ‚s Frage zunächst gedacht. Aber jeder wird auf dem (0..20) aufgerufen und muss durch einen anderen Schritt (5) ersetzt werden, wenn Sie den 0-5-10-15-20-Bereich "wiederverwenden" möchten.

Vielleicht werden Sie mit etwas wie (0..3).map{|i| i*5} in Ordnung sein?

Aber "persistierenden" die Ergebnisse der Schritt-Methode mit.to_asollte auch feine arbeiten.

+0

"ernsthaft schadet der Lesbarkeit" - * was * ?! Warum? Wie? –

+3

Ich würde argumentieren, dass Schritt ist lesbarer als eine Karte dieser Art, zumindest in diesem Fall. – Amber

+0

'(0..20) .Schritt (5) .Each {...}. Jeder {...}' wird tun, was Sie wollen. –

25

Versuchen Sie, .step() zu verwenden, um bei einem bestimmten Schritt durchzugehen.

(0..20).step(5) do |n| 
    print n,' ' 
end 

gibt ...

0 5 10 15 20 

Wie dominikh erwähnt, Sie .to_a am Ende zu bekommen eine speicherbare Form der Zahlenliste hinzufügen: (0..20).step(5).to_a

+3

und wenn Sie die Zahlen speichern möchten, können Sie (0..10) .step (5) .to_a verwenden - dies erfordert jedoch ruby> = 1.8.7. Eine Alternative ist 0.step (10, 5) .to_a, die auch benötigt wird ruby> = 1.8.7 –

4

Wie Dav sagte, aber add to_a:

(0..20).step(5).to_a # [0, 5, 10, 15, 20] 
+0

Sie müssen normalerweise 'to_a' nicht hinzufügen, es sei denn, Sie * brauchen * wirklich ein Array. –