2012-03-29 95 views
8

假設我有以下如何跳過Ruby中的循環中的幾個迭代?

for(i = 0; i < 10; i++){ 
    printf("Hello"); 
    if(i == 5){ 
     a[3] = a[2] * 2; 
     if(a[3] == b) 
      i = a[3];   //Skip to index = a[3]; depends on runtime value 
    } 
} 

如何轉換到Ruby的C代碼?我知道我們可以使用next跳過一次迭代,但是我必須根據條件值跳過幾次迭代,並且我不知道在運行前要跳過多少次迭代?


這裏是我實際工作於(如由Coreyward提及)的代碼:我尋找陣列中「直線」的數值相差小於0.1(小於0.1將

視爲「直線」)。該範圍必須長於50才能被視爲長「線」。找到行範圍[a,b]後,我想跳過迭代到上限b,所以它不會再從+ 1開始,它會開始從b + 1中找到新的「直線」。

for(i=0; i<arr.Length; i++){ 
    if(arr[i] - arr[i + 50] < 0.1){ 
    m = i;         //m is the starting point 
    for(j=i; j<arr.Length; j++){    //this loop makes sure all values differs less than 0.1 
     if(arr[i] - arr[j] < 0.1){ 
     n = j; 
     }else{ 
     break; 
     } 
    } 
    if(n - m > 50){       //Found a line with range greater than 50, and store the starting point to line array 
     line[i] = m 
    } 
    i = n          //Start new search from n 
    } 

}

+2

這將是大有幫助,如果你提供你想要達到什麼目的。在Enumerator類中有一些非常方便的方法可以讓你設置下一次迭代的值('feed')並查看下一個值('peek'),並且你還可以使用for循環紅寶石。我確信有一個更清晰的寫作方式,我只是不知道它在做什麼。 – coreyward 2012-03-29 18:09:29

+0

你要在C中索引數組的末尾,可能想要將邊界改爲'arr.Length-50'。這似乎是一個有點複雜的方式來找到50個或更多的價值與初始值的epsilon運行。 – dbenhur 2012-03-29 18:48:25

+0

您似乎認爲較大指數的值永遠不會低於指數較低的值。這是真的? – dbenhur 2012-03-29 18:52:25

回答

2

另一種方法是使用enumerator類:

iter = (1..10).to_enum 
while true 
    value = iter.next 
    puts "value is #{value.inspect}" 
    if value == 5 
    3.times {value = iter.next} 
    end 
end 

value is 1 
value is 2 
value is 3 
value is 4 
value is 5 
value is 9 
value is 10 
StopIteration: iteration reached at end 
     from (irb):15:in `next' 
     from (irb):15 
     from C:/Ruby19/bin/irb:12:in `<main>' 
+0

這很可愛,但並不等同於直接推進索引。如果用i遍歷一個數組並且達到了想要前進到索引j的決定,那麼執行'(j-i).times {iter.next}'比分配'i = j'更加複雜和昂貴。 – dbenhur 2012-04-03 16:28:19

3

你的情況下,不容易被典型紅寶石迭代器覆蓋,但Ruby也有普通的,同時它可以完全覆蓋環C-的。以下相當於上面的c for循環。

i = 0; 
while i < 10 
    puts "Hello" 
    if i == 5 
    a[3] = a[2] * 2 
    i = a[3] if a[3] == b 
    end 
    # in your code above, the for increment i++ will execute after assigning new i, 
    # though the comment "Skip to index = a[3]" indicates that may not be your intent 
    i += 1 
end 
+0

是的,這有效,但有沒有辦法與統計員做到這一點?我在考慮'drop',因此它會將值降到5和a [3]之間,但是當我開始編碼時會感到困惑和迷茫。 – texasbruce 2012-03-29 18:31:21