Syntaxe d'une boucle for en ruby

87

Comment faire ce type de boucle for dans Ruby?

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

}
DNB5brims
la source
@johannes Lire un livre est une bonne idée, mais de préférence pas un livre sur Ruby 1.6!
Andrew Grimm
N'oubliez pas de jeter un œil à quelques méthodes utiles dans ruby-doc: module Enumerable .
Ivan Chau

Réponses:

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

ou

for element in array do
  element.do_stuff
end

Si vous avez besoin d'index, vous pouvez utiliser ceci:

array.each_with_index do |element,index|
  element.do_stuff(index)
end
Eimantas
la source
15
Je cherchais spécifiquement l'indexation en boucle, aucune de ces solutions ne rend immédiatement évident comment faire cela. l'op a trahi ses intentions avec array.length dans le code ...
jheriko
6
Lisez attentivement ma réponse. Il existe une solution de bouclage avec indexation incluse.
Eimantas
8
Souvent, eachc'est génial. Mais parfois, je veux juste une putain de boucle for traditionnelle. Parfois, la "méthode Ruby" peut être tout simplement ennuyeuse.
Ruben Martinez Jr.
1
comment définir manuellement l'index en rubis pour pouvoir écrire un tri moi
Muhammad Umer
6
et si je veux sauter les deux prochaines itérations
Muhammad Umer
77
limit = array.length;
for counter in 0..limit
 --- make some actions ---
end

l'autre façon de faire est la suivante

3.times do |n|
  puts n;
end

cela affichera 0, 1, 2, donc pourrait être utilisé comme un itérateur de tableau aussi

Pensez que cette variante correspond mieux aux besoins de l'auteur

Ph0en1x
la source
29

Je continue à frapper ceci comme un lien principal pour google "ruby for loop", donc je voulais ajouter une solution pour les boucles où l'étape n'était pas simplement "1". Dans ces cas, vous pouvez utiliser la méthode «step» qui existe sur les objets Numerics et Date. Je pense que c'est une approximation proche pour une boucle «pour».

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
la source
20

L'équivalence serait

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

ou

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

ou

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

Ce n'est pas très rubis, mais c'est le meilleur moyen de faire la boucle for à partir d'une question en Ruby

EmFi
la source
C'est génial. Il est vrai que la réponse n'est pas eachmais plutôt each_index. +1
Dan Rosenstark
12

Pour itérer une boucle un nombre fixe de fois, essayez:

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

Si vous n'avez pas besoin d'accéder à votre tableau , (juste une simple boucle for), vous pouvez utiliser upto ou each:

Jusqu'à:

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

Chaque:

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

Quelle? Depuis 2010 et personne n'a mentionné que Ruby avait une boucle fine for / in (c'est juste que personne ne l'utilise):

ar = [1,2,3,4,5,6]
for item in ar
  puts item
end
Steenslag
la source
5
Un avantage de .each ... do est que le bloc temporaire tombe hors de portée à la fin de la boucle, tandis que for ... in laisse le bloc temporaire dans la portée.
Wayne Conrad
4
['foo', 'bar', 'baz'].each_with_index {|j, i| puts "#{i} #{j}"}
TU
la source
0

La syntaxe de la boucle d'énumération de Ruby est différente:

collection.each do |item|
...
end

Cela se lit comme "un appel à la méthode 'each' de l'instance d'objet tableau 'collection' qui prend un bloc avec 'blockargument' comme argument". La syntaxe de bloc dans Ruby est 'do ... end' ou '{...}' pour les instructions sur une seule ligne.

L'argument de bloc '| item |' est facultatif mais s'il est fourni, le premier argument représente automatiquement l'élément énuméré en boucle.

JackyJohnson
la source