2009-12-09 10 views

Respuesta

11

sí se puede utilizar each_with_index

collection = ["element1", "element2"] 
collection.each_with_index {|item,index| puts item; puts index} 

el 'índice' variable que da el índice de elemento durante cada iteración

4

En Ruby, el bucle for puede implementarse como:

1000.times do |i| 
    # do stuff ... 
end 

Si desea que el elemento y el índice de la sintaxis each_with_index es probablemente el mejor:

collection.each_with_index do |element, index| 
    # do stuff ... 
end 

Sin embargo el bucle each_with_index es más lento ya que proporciona los objetos element y index para cada iteración del ciclo.

+3

'each_with_index' no es más lento que hacer una búsqueda de matriz para cada elemento. Debería ser bastante más rápido. – Chuck

+0

Correcto, pero si no realiza la búsqueda de matriz para cada iteración del ciclo, 'each_with_index' puede ser más lento. En última instancia, depende del ciclo del curso. – erik

+1

Bueno, sí, si no está usando una matriz, obviamente no querrá usar un método de matriz ... – Chuck

15

Ruby tiende a utilizar iteradores en lugar de bucles; puedes obtener toda la función de los bucles con los poderosos iteradores de Ruby.

Hay varias opciones para hacer esto, supongamos que tiene una 'arr' matriz de tamaño 1000.

1000.times {|i| puts arr[i]} 
0.upto(arr.size-1){|i| puts arr[i]} 
arr.each_index {|i| puts arr[i]} 
arr.each_with_index {|e,i| puts e} #i is the index of element e in arr 

Todos estos ejemplos proporcionan la misma funcionalidad

+0

Agregaría que también puede usar un bucle for, como en: for i in (0. ..arr.length); pone arr [i]; end – philosodad

10

¿Qué tal step?

0.step(1000,2) { |i| puts i } 

es equivalente a:

for (int i=0; i<=1000; i=i+2) { 
    // do stuff 
} 
0

times se recomienda más de each_with_index. times es alrededor de 6 veces más rápido. Ejecute el código a continuación.

require "benchmark" 

TESTS = 10_000_000 
array = (1..TESTS).map { rand } 
Benchmark.bmbm do |results| 
    results.report("times") do 
    TESTS.times do |i| 
     # do nothing 
    end 
    end 

    results.report("each_with_index") do 
    array.each_with_index do |element, index| 
     # Do nothing 
    end 
    end 
end 

Obtuve el resultado de la siguiente manera con mi MacBook (Intel Core2Duo).

Rehearsal --------------------------------------------------- 
times    1.130000 0.000000 1.130000 ( 1.141054) 
each_with_index 7.550000 0.210000 7.760000 ( 7.856737) 
------------------------------------------ total: 8.890000sec 

         user  system  total  real 
times    1.090000 0.000000 1.090000 ( 1.099561) 
each_with_index 7.600000 0.200000 7.800000 ( 7.888901) 
+0

no está accediendo a los elementos de la matriz en el punto de referencia 'times' - está comparando una búsqueda de matriz con un bucle vacío – user214028

0

cuando sólo necesito los números (y no querer repetir) Yo prefiero esta:

bucle
(0..10000).each do |v| 
    puts v 
end 
4

El mientras ejecuta sus tiempos de cuerpo cero o más, siempre y cuando su condición es verdadera.

while <condition> 
    # do this 
end 

El ciclo while puede sustituir al ciclo 'for' de Java. En Java,

for (initialization;, condition;, incrementation;){ 
    //code 
} 

es igual que siguiente (excepto, en la segunda forma, las variables inicializadas no son locales para-loop).

initialization; 
for(, condition;,) { 
    //code 
    incrementation; 
} 

El bucle 'while' de ruby ​​se puede escribir de esta forma para que funcione como for-loop de Java. En Ruby,

initialization; 
while(condition) 
    # code 
    incrementation; 
end 

Nótese que la 'while' (y 'hasta' y 'de') de bucle no introduce un nuevo ámbito de aplicación; Los lugareños previamente existentes se pueden usar en el bucle y los nuevos locales creados estarán disponibles más adelante.

2
for i in 0..100 do 
    #bla bla 
end 
Cuestiones relacionadas