2009-12-09 6 views

risposta

11

Sì, è possibile utilizzare each_with_index

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

l' 'indice' variabile ti dà l'indice dell'elemento durante ogni iterazione

4

In Ruby, il ciclo for può essere implementato come:

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

Se si desidera che sia l'elemento e l'indice quindi la sintassi each_with_index è probabilmente la cosa migliore:

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

Tuttavia il each_with_index ciclo è più lento poiché fornisce sia gli oggetti element e index per ogni iterazione del ciclo.

+3

'each_with_index' non è più lento di una ricerca di matrice per ciascun elemento. Dovrebbe essere un po 'più veloce. – Chuck

+0

Corretto, ma se non si esegue la ricerca della matrice per ogni iterazione del ciclo, 'each_with_index' potrebbe essere più lento. Alla fine dipende dal ciclo, naturalmente. – erik

+1

Beh, sì, se non stai usando un array, ovviamente non vorrai usare un metodo array ... – Chuck

15

Ruby tende a utilizzare iteratori anziché loop; puoi ottenere tutta la funzione dei loop con i potenti iteratori di Ruby.

Ci sono diverse scelte per fare questo, supponiamo di avere un 'arr' array di dimensione 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 

Tutti questi esempi forniscono la stessa funzionalità

+0

Vorrei aggiungere che puoi anche usare un ciclo for, come in: for i in (0. ..arr.length); mette arr [i]; fine – philosodad

10

Come su step?

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

è equivalente a:

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

times è raccomandato su each_with_index. times è circa 6 volte più veloce. Esegui il codice qui sotto.

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 

Ho ottenuto il risultato come di seguito con il mio 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

non si accede agli elementi dell'array nel benchmark "times" - si sta confrontando una ricerca di array con un ciclo vuoto – user214028

0

quando ho solo bisogno i numeri (e non vogliono iterare) preferisco questo:

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

Il while esegue il corpo zero o più volte fino a quando la sua condizione è vera.

while <condition> 
    # do this 
end 

Il ciclo while può sostituire il ciclo "for" di Java. In Java,

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

è stessa seguente (tranne il secondo modulo, variabili inizializzate non sono locali per-loop).

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

Il ciclo "while" di ruby ​​può essere scritto in questo modulo per funzionare come ciclo di Java. In Ruby,

initialization; 
while(condition) 
    # code 
    incrementation; 
end 

noti che il 'mentre' (e 'fino a' e 'per') ciclo non introduce un nuovo ambito; i locals precedentemente esistenti possono essere utilizzati nel ciclo e in seguito saranno disponibili nuovi locals creati.

2
for i in 0..100 do 
    #bla bla 
end 
Problemi correlati