2009-12-09 87 views

回答

11

是的,你可以在每次迭代

1

您可以通過用戶each with index使用each_with_index

​​

的「索引」變量給你的元素索引。

4

在Ruby中,for迴路可以實現爲:

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

如果你想同時得到元素和索引,則each_with_index語法可能是最好的:

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

然而each_with_index環因爲它爲循環的每次迭代提供了elementindex對象,所以速度較慢。

+3

'each_with_index'不會比爲每個元素進行數組查找慢。它應該快得多。 – Chuck 2009-12-09 06:40:10

+0

正確,但是如果您沒有爲循環的每次迭代執行數組查找,'each_with_index'可能會變慢。它最終取決於循環當然。 – erik 2009-12-09 14:54:28

+1

嗯,是的,如果你不使用數組,顯然你不會想要使用數組方法... – Chuck 2009-12-09 20:25:32

15

Ruby傾向於使用迭代器而不是循環;您可以使用Ruby強大的迭代器獲取所有循環函數。

有幾種選擇,要做到這一點,讓我們假設你有一個數組「改編」大小的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 

所有這些例子都提供相同的功能

+0

我會補充說,你也可以使用for循環,如下所示:for i in(0。 ..arr.length);放置arr [i];結束 – philosodad 2012-05-19 12:36:03

10

如何step

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

等同於:

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

times建議在each_with_indextimes快6倍左右。運行下面的代碼。

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 

我用我的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

您沒有訪問'times'基準測試中的數組元素 - 您正在比較數組查找和空循環 – user214028 2009-12-09 11:17:43

0

當我需要的只是數字(和不想重複),我更喜歡這樣的:

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

while循環,只要條件爲真執行其身體零次或多次。

while <condition> 
    # do this 
end 

while循環可以替代Java的'for'循環。 在Java中,

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

是相同如下(除,在第二形式中,初始化變量不是本地的for循環)。

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

ruby​​'while'循環可以寫成這種形式來作爲for循環的Java。在Ruby中,

initialization; 
while(condition) 
    # code 
    incrementation; 
end 

請注意'while'(和'until'和'for')循環不會引入新的作用域;先前存在的本地人可以在循環中使用,並且新創建的本地人將在之後可用。

2
for i in 0..100 do 
    #bla bla 
end 
相關問題