Sintaxis para un bucle for en ruby

87

¿Cómo hago este tipo de bucle for en Ruby?

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

}
DNB5brims
fuente
@johannes Leer un libro es una buena idea, ¡pero preferiblemente no sobre Ruby 1.6!
Andrew Grimm
No olvide echar un vistazo a algunos métodos útiles en ruby-doc: Módulo enumerable .
Ivan Chau

Respuestas:

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

o

for element in array do
  element.do_stuff
end

Si necesita un índice, puede usar esto:

array.each_with_index do |element,index|
  element.do_stuff(index)
end
Eimantas
fuente
15
Estaba buscando específicamente indexar en un bucle, ninguna de estas soluciones hace que sea inmediatamente obvio cómo hacerlo. el operador traicionó sus intenciones con array.length en el código ...
jheriko
6
Lea mi respuesta con atención. Hay una solución de bucle con indexación incluida.
Eimantas
8
Muchas veces, eaches genial. Pero a veces solo quiero un maldito bucle tradicional. A veces, el "modo Ruby" puede ser simplemente molesto.
Ruben Martinez Jr.
1
¿Cómo configuro manualmente el índice en ruby ​​para poder escribir una clasificación yo mismo?
Muhammad Umer
6
¿Qué pasa si quiero omitir las próximas dos iteraciones
Muhammad Umer
77
limit = array.length;
for counter in 0..limit
 --- make some actions ---
end

la otra forma de hacerlo es la siguiente

3.times do |n|
  puts n;
end

eso imprimirá 0, 1, 2, por lo que también podría usarse como iterador de matriz

Piense que esa variante se ajusta mejor a las necesidades del autor.

Ph0en1x
fuente
29

Sigo presionando esto como un enlace superior para google "ruby for loop", así que quería agregar una solución para los bucles donde el paso no era simplemente '1'. Para estos casos, puede usar el método 'paso' que existe en los objetos Numéricos y Fecha. Creo que esta es una aproximación cercana para un bucle 'for'.

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
fuente
20

La equivalencia sería

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

o

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

o

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

No es muy Rubyish, pero es la mejor manera de hacer el bucle for de la pregunta en Ruby

EmFi
fuente
Esto es brillante. Es cierto que la respuesta no es eachsino más bien each_index. +1
Dan Rosenstark
12

Para iterar un bucle un número fijo de veces, intente:

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

Si no necesita acceder a su matriz , (solo un bucle for simple) puede usar hasta o cada uno:

Hasta:

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

Cada:

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

¿Qué? Desde 2010 y nadie mencionó que Ruby tiene un bucle for / in fine (es solo que nadie lo usa):

ar = [1,2,3,4,5,6]
for item in ar
  puts item
end
Steenslag
fuente
5
Una ventaja de .each ... do es que el bloque temporal queda fuera del alcance al final del ciclo, mientras que for ... in deja el alcance temporal.
Wayne Conrad
4
['foo', 'bar', 'baz'].each_with_index {|j, i| puts "#{i} #{j}"}

fuente
0

La sintaxis del bucle de enumeración de Ruby es diferente:

collection.each do |item|
...
end

Esto se lee como "una llamada al método 'each' de la instancia de objeto de matriz 'colección' que toma un bloque con 'blockargument' como argumento". La sintaxis de bloque en Ruby es 'do ... end' o '{...}' para declaraciones de una sola línea.

El argumento de bloque '| elemento |' es opcional, pero si se proporciona, el primer argumento representa automáticamente el elemento enumerado en bucle.

JackyJohnson
fuente