是否有類似於Java/C(++)的for循環的Ruby版本?是否有類似於Java/C++的for循環的Ruby版本?
在Java:
for (int i=0; i<1000; i++) {
// do stuff
}
的原因是因爲我需要根據迭代的指數做不同的操作。看起來Ruby只有一個for-each循環?
我正確嗎?
是否有類似於Java/C(++)的for循環的Ruby版本?是否有類似於Java/C++的for循環的Ruby版本?
在Java:
for (int i=0; i<1000; i++) {
// do stuff
}
的原因是因爲我需要根據迭代的指數做不同的操作。看起來Ruby只有一個for-each循環?
我正確嗎?
是的,你可以在每次迭代
您可以通過用戶each with index使用each_with_index
的「索引」變量給你的元素索引。
在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
環因爲它爲循環的每次迭代提供了element
和index
對象,所以速度較慢。
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
所有這些例子都提供相同的功能
我會補充說,你也可以使用for循環,如下所示:for i in(0。 ..arr.length);放置arr [i];結束 – philosodad 2012-05-19 12:36:03
如何step
?
0.step(1000,2) { |i| puts i }
等同於:
for (int i=0; i<=1000; i=i+2) {
// do stuff
}
times
建議在each_with_index
。 times
快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)
您沒有訪問'times'基準測試中的數組元素 - 您正在比較數組查找和空循環 – user214028 2009-12-09 11:17:43
當我需要的只是數字(和不想重複),我更喜歡這樣的:
(0..10000).each do |v|
puts v
end
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')循環不會引入新的作用域;先前存在的本地人可以在循環中使用,並且新創建的本地人將在之後可用。
for i in 0..100 do
#bla bla
end
'each_with_index'不會比爲每個元素進行數組查找慢。它應該快得多。 – Chuck 2009-12-09 06:40:10
正確,但是如果您沒有爲循環的每次迭代執行數組查找,'each_with_index'可能會變慢。它最終取決於循環當然。 – erik 2009-12-09 14:54:28
嗯,是的,如果你不使用數組,顯然你不會想要使用數組方法... – Chuck 2009-12-09 20:25:32