2010-01-09 32 views
57

¿Cómo hago este tipo de bucle for en Ruby?Sintaxis de un bucle for en ruby ​​

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

} 
+0

@johannes leer un libro es una buena idea, pero preferiblemente no uno sobre Ruby 1.6! –

+0

No olvides echar un vistazo a algunos métodos útiles en [ruby-doc: módulo Enumerable] (http://www.ruby-doc.org/core/classes/Enumerable.html). –

Respuesta

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

o

for element in array do 
    element.do_stuff 
end 

Si necesita índice, puede utilizar esto:

array.each_with_index do |element,index| 
    element.do_stuff(index) 
end 
+10

estaba buscando específicamente la indexación en un bucle, ninguna de estas soluciones hace que sea inmediatamente obvio cómo hacerlo. el op traicionó sus intenciones con array.length en el código ... – jheriko

+4

Lea mi respuesta detenidamente. Hay una solución de bucle con indexación incluida. – Eimantas

+0

¿Esto siempre estuvo ahí? salta y me muerde en la nariz ... – jheriko

3
['foo', 'bar', 'baz'].each_with_index {|j, i| puts "#{i} #{j}"} 
13
array.each_index do |i| 
    ... 
end 

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

+0

Esto es brillante. Es cierto que la respuesta no es 'cada' sino 'each_index'. +1 –

60
limit = array.length; 
for counter in 0..limit 
--- make some actions --- 
end 

la otra manera de hacerlo es la siguiente

3.times do |n| 
    puts n; 
end 

eso se imprimirá 0, 1, 2, por lo que podría ser utilizado como gama iterador también

Piense que la variante mejor ajuste a las necesidades del autor

7

¿Qué? A partir de 2010 y nadie ha mencionado Ruby tiene una multa por/en bucle (es sólo que nadie lo usa):

ar = [1,2,3,4,5,6] 
for item in ar 
    puts item 
end 
+5

Una de las ventajas de * .each ... do * es que el bloque temporal cae fuera del alcance al final del ciclo, mientras que * para ... in * deja el ámbito temporal. –

7

Si no es necesario acceder a la matriz, (sólo un simple bucle for) que pueda utilizar upto o cada uno:

Upto:

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 
24

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

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 
+1

+1, gracias. Estaba buscando una buena manera de contar ... –

9

Para repetir un bucle un número determinado de veces, pruebe:

n.times do 
    #Something to be done n times 
end 
+2

Esto funciona cuando se necesita usar el índice: 3.times do | i | – tobixen

0

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

collection.each do |item| 
... 
end 

Esto lee como "una llamada a la 'cada uno 'método de la' colección 'de instancia de objeto de matriz que toma el bloque con' argumento de bloque 'como argumento ". La sintaxis de bloque en Ruby es 'do ... end' o '{...}' para sentencias de línea única.

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

5

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