2009-12-09 5 views

Antwort

11

Ja können Sie each_with_index

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

die 'index' Variable gibt Ihnen die Element-Index während jeder Iteration

1

Sie können each with index Benutzer verwenden.

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

Wenn Sie sowohl das Element wollen und den Index dann die each_with_index Syntax wahrscheinlich am besten ist:

4

In Ruby, die for Schleife als implementiert werden kann

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

jedoch die each_with_index Schleife ist langsamer, da es die Objekte element und index für jede Iteration der Schleife bereitstellt.

+3

'each_with_index' ist nicht langsamer als eine Array-Suche für jedes Element. Es sollte ein bisschen schneller sein. – Chuck

+0

Korrekt, aber wenn Sie die Array-Suche nicht für jede Iteration der Schleife durchführen, ist "each_with_index" möglicherweise langsamer. Letztendlich hängt es natürlich von der Schleife ab. – erik

+1

Nun, ja, wenn Sie kein Array verwenden, werden Sie offensichtlich keine Array - Methode verwenden wollen ... – Chuck

15

Ruby neigt dazu, Iteratoren anstelle von Schleifen zu verwenden; Sie können die ganze Funktion von Schleifen mit den leistungsstarken Iteratoren von Ruby erhalten.

Es gibt mehrere Möglichkeiten, dies zu tun, nehmen wir an, Sie haben eine Reihe ‚arr‘ der Größe 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 

Alle diese Beispiele bieten die gleiche Funktionalität

+0

Ich würde hinzufügen, dass Sie auch eine for - Schleife verwenden können, wie in: für i in (0. ..rr.length); setzt arr [i]; Ende – philosodad

10

Wie wäre es step?

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

entspricht:

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

times über each_with_index empfohlen. times ist etwa 6 mal schneller. Führen Sie den folgenden Code aus.

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 

Ich habe das Ergebnis wie folgt mit meinem 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

Sie greifen nicht auf die Array-Elemente im 'Times' Benchmark zu - Sie vergleichen eine Array-Suche mit einer leeren Schleife – user214028

0

wenn ich brauche nur die Zahlen (und nicht wiederholen wollen) Ich ziehe diese:

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

Die while-Schleife führt seinen Körper null oder mehrere Male, so lange seine Bedingung wahr ist.

while <condition> 
    # do this 
end 

Die while-Schleife kann die 'for'-Schleife von Java ersetzen. In Java

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

folgend gleiche ist (außer in der zweiten Form, initialisiert Variablen for-Schleife nicht lokal).

Die Ruby While-Schleife kann in dieser Form geschrieben werden, um als For-Schleife von Java zu arbeiten. In Ruby

initialization; 
while(condition) 
    # code 
    incrementation; 
end 

Man beachte, dass die ‚während‘ (und ‚bis‘ und ‚für‘) Schleife einzuführen keinen neuen Rahmen; Bereits vorhandene Locals können in der Schleife verwendet werden, und neue Locals werden später verfügbar sein.

2
for i in 0..100 do 
    #bla bla 
end 
Verwandte Themen