2010-06-12 8 views
11

UPDATE 2: Für die Nachwelt das ist, wie ich es zu tun (dank Jorgs Eingang) entschieden haben:Deklarieren eine ganze Zahl Bereich mit Schritt = 1 in Ruby

100.step(2, -2) do |x| 
    # my code 
end 

(Natürlich gibt es viele Möglichkeiten, dies zu tun, aber es klingt wie dies die „Ruby“ Art und Weise, es zu tun, und das ist genau das, was ich war nach)


UPDATE. OK, also was ich gesucht für war step:

(2..100).step(2) do |x| 
    # my code 
end 

Aber es stellt sich heraus, dass ich in meiner ursprünglichen Frage nicht 100% bereit war. Ich möchte diesen Bereich tatsächlich rückwärts durchlaufen. Zu meiner Überraschung ist ein negativer Schritt nicht legal.

Also: Wie mache ich das rückwärts?


Hey Jungs, ich bin völlig neue Ruby, sein so sanft.

Angenommen, ich möchte über den Bereich der geraden Zahlen von 2 bis 100 iterieren; Wie würde ich das tun?

Offensichtlich ich könnte tun:

(2..100).each do |x| 
    if x % 2 == 0 
     # my code 
    end 
end 

Aber offensichtlich (wieder), das wäre ziemlich dumm.

Ich weiß, dass ich etwas tun könnte wie: (?)

i = 2 
while i <= 100 
    # my code 
    i += 2 
end 

Ich glaube, ich könnte auch meine eigene benutzerdefinierte Klasse schreiben, die ihre eigene each Methode zur Verfügung stellt. Ich bin mir fast sicher, dass das ein Overkill wäre.

ich in zwei Dingen interessiert bin:

  1. Ist es möglich dies der Standardbereich Syntax mit einigen Variationen zu tun (das heißt, (x..y).each)?
  2. Wie auch immer, was wäre der idiomatische "Ruby Way", um dies zu erreichen (mit einem Range oder anders)? Wie ich schon sagte, ich bin neu in der Sprache. also jede Anleitung, die Sie anbieten können, wie man Dinge in einem typischeren Rubin-Stil macht, würde sehr geschätzt werden.

Antwort

19

Sie können keine Range mit einem "Schritt" erklären. Bereiche haben keine Schritte, sie haben einfach einen Anfang und ein Ende.

Sie können sicher Iterierte über einen Range in den Schritten, zum Beispiel wie folgt aus:

(2..100).step(2).reverse_each(&method(:p)) 

Aber wenn alles, was Sie wollen wiederholen ist, was dann brauchen Sie das Range für in erster Linie? Warum nicht einfach iterieren?

100.step(2, -2, &method(:p)) 

Dies hat den zusätzlichen Vorteil, dass im Gegensatz zu reverse_each es keine Zwischen Array zu erzeugen, benötigt.

+0

Schön. Genau das, was ich brauchte - und danke auch für die Klärung meiner Terminologie. Viel aufräumen! –

+0

@ Jörg keine Ahnung wie du mit der letzten Aussage gelandet bist? Die Dokumente für Schritt erwähnen nur ein Argument, also habe ich mich gefragt, wie Sie zu dieser prägnanten Lösung dieses Problems gekommen sind. –

+0

@n_x_l: Ich bin mir nicht sicher, welche Dokumente Sie betrachten, der 'step' Parameter ist [klar dokumentiert] (http://Ruby-Doc.Org/core-2.1.1/Numeric.html#method-i -Schritt). Die ältesten Dokumente, die ich finden konnte, waren die für Ruby 1.8.6 und es war damals schon da (http://Ruby-Doc.Org/core-1.8.6/Numeric.html#method-i-step) im Jahr 2007. –

3

Diese Frage beantwortet Ihnen: about ruby range?

(2..100).step(2) do |x| 
    # your code 
end 
+0

So einfach, was? Vielen Dank! –

+0

Also, wie würde ich es rückwärts machen? –

1

ich ähnliches Problem hatte hier sind die verschiedenen Möglichkeiten, wie ich die gleiche einfache Sache, die ich Schritt am Ende verwendet tun gefunden, weil es für NEGATIVE und FRACTIONAL Schritte erlaubt und ich hatte keine Bedingungen, anders als die Grenzen für

aussehen
case loop_type 

    when FOR 
     # doen't appear to have a negative or larger than 1 step size! 
     for kg in 50..120 do 
     kg_to_stones_lbs(kg) 
     end 

    when STEP 
     120.step(70,-0.5){ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when UPTO 
     50.upto(120) { |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when DOWNTO 
     120.downto(50){ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when RANGE 
     (50..120).reverse_each{ |kg| 
     kg_to_stones_lbs(kg) 
     } 

    when WHILE 
     kg = 120 
     while kg >= 50 
     kg_to_stones_lbs(kg) 
     kg -= 0.5 
     end 
    end 

O/P:

92.0kg - 14st 7lbs

91.5kg - 14st 6kg

91.0kg - 14st 5kg

90.5kg - 14st 4kg

90.0kg - 14st 2lbs

89.5kg - 14st 1lbs

89.0kg - 14st 0lbs

88.5kg - 13st 13lbs

88,0 kg - 13st 12lbs

Verwandte Themen