Syntax für eine for-Schleife in Ruby

87

Wie mache ich diese Art von for-Schleife in Ruby?

for(int i=0; i<array.length; i++) {

}
DNB5brims
quelle
@johannes Ein Buch zu lesen ist eine gute Idee, aber vorzugsweise keine über Ruby 1.6!
Andrew Grimm
Vergessen Sie nicht, einige nützliche Methoden in ruby-doc: Enumerable module zu betrachten .
Ivan Chau

Antworten:

118
array.each do |element|
  element.do_stuff
end

oder

for element in array do
  element.do_stuff
end

Wenn Sie einen Index benötigen, können Sie diesen verwenden:

array.each_with_index do |element,index|
  element.do_stuff(index)
end
Eimantas
quelle
15
Ich habe speziell nach der Indizierung in einer Schleife gesucht. Keine dieser Lösungen macht sofort klar, wie das geht. Der Op verriet seine Absichten mit Array.Länge im Code ...
Jheriko
6
Lesen Sie meine Antwort sorgfältig durch. Es gibt eine Schleifenlösung mit Indizierung.
Eimantas
8
Oft eachist das toll. Aber manchmal möchte ich nur eine gottverdammte traditionelle Schleife. Manchmal kann der "Ruby Way" einfach nur nervig sein.
Ruben Martinez Jr.
1
Wie setze ich den Index manuell in Ruby, damit ich selbst eine Sortierung schreiben kann
Muhammad Umer
6
Was ist, wenn ich die nächsten zwei Iterationen überspringen möchte
Muhammad Umer
77
limit = array.length;
for counter in 0..limit
 --- make some actions ---
end

Der andere Weg, dies zu tun, ist der folgende

3.times do |n|
  puts n;
end

das wird 0, 1, 2 drucken, könnte also auch wie ein Array-Iterator verwendet werden

Denken Sie, dass diese Variante besser zu den Bedürfnissen des Autors passt

Ph0en1x
quelle
29

Ich treffe dies immer wieder als Top-Link für Google "Ruby for Loop", daher wollte ich eine Lösung für Loops hinzufügen, bei denen der Schritt nicht einfach "1" war. In diesen Fällen können Sie die Schrittmethode verwenden, die für Numerik- und Datumsobjekte vorhanden ist. Ich denke, dies ist eine enge Annäherung für eine 'for'-Schleife.

start = Date.new(2013,06,30)
stop = Date.new(2011,06,30)
# step back in time over two years, one week at a time
start.step(stop, -7).each do |d| 
    puts d
end
dsz
quelle
20

Die Äquivalenz wäre

for i in (0...array.size)
end

oder

(0...array.size).each do |i|
end

oder

i = 0
while i < array.size do
   array[i]
   i = i + 1 # where you may freely set i to any value
end
jsh-c
quelle
17
array.each_index do |i|
  ...
end

Es ist nicht sehr Rubyish, aber es ist der beste Weg, um die for-Schleife aus der Frage in Ruby zu machen

EmFi
quelle
Das ist brilliant. Es ist wahr, dass die Antwort nicht eachsondern ist each_index. +1
Dan Rosenstark
12

Versuchen Sie Folgendes, um eine Schleife eine feste Anzahl von Malen zu wiederholen:

n.times do
  #Something to be done n times
end
yts
quelle
10

Wenn Sie nicht auf Ihr Array zugreifen müssen (nur eine einfache for-Schleife), können Sie bis zu oder jedes verwenden:

Bis zu:

1.9.3p392 :030 > 2.upto(4) {|i| puts i}
2
3
4
 => 2 

Jeder:

1.9.3p392 :031 > (2..4).each {|i| puts i}
2
3
4
 => 2..4 
Benjamin Crouzier
quelle
8

Was? Ab 2010 hat niemand erwähnt, dass Ruby eine Geldstrafe für / in-Schleife hat (es wird nur von niemandem verwendet):

ar = [1,2,3,4,5,6]
for item in ar
  puts item
end
steenslag
quelle
5
Ein Vorteil von .each ... do besteht darin, dass der temporäre Block am Ende der Schleife aus dem Gültigkeitsbereich fällt, während für ... in der temporäre Bereich im Gültigkeitsbereich verbleibt .
Wayne Conrad
4
['foo', 'bar', 'baz'].each_with_index {|j, i| puts "#{i} #{j}"}
SIE
quelle
0

Rubys Aufzählungsschleifensyntax ist anders:

collection.each do |item|
...
end

Dies lautet "Aufruf der Methode 'each' der Array-Objektinstanz 'collection', die einen Block mit dem Argument 'blockargument' verwendet". Die Blocksyntax in Ruby lautet 'do ... end' oder '{...}' für einzeilige Anweisungen.

Das Blockargument '| item |' ist optional, aber falls angegeben, repräsentiert das erste Argument automatisch das in einer Schleife aufgezählte Element.

JackyJohnson
quelle