2012-03-29 10 views
8

Załóżmy, że mam kodu C poniżejjak pominąć kilka iteracji w pętli w 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 
    } 
} 

Jak przekonwertować do Ruby? Wiem, że możemy pominąć jedną iterację za pomocą next, ale muszę pominąć kilka iteracji w zależności od wartości warunkowej i nie wiem, ile iteracji należy pominąć przed uruchomieniem?


Oto kod mam rzeczywiście działa na (jak wspomniano przez Coreyward):

szukam „linii prostej” w tablicy, że wartości różni się mniej niż 0,1 (mniej niż 0,1 będzie uważany za "linię prostą"). Zakres musi być dłuższy niż 50, aby można go było uznać za długą "linię". Po znalezieniu zakresu linii [a, b], chcę pominąć iteracje do górnego limitu b, aby nie zaczął się ponownie od a + 1, i zacznie znajdować nową "linię prostą" od 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

Byłoby o wiele bardziej przydatne, jeśli pod warunkiem, intencji, co próbujesz osiągnąć. W Enumeratorze jest kilka całkiem przydatnych metod, które pozwalają ci ustawić wartość następnej iteracji ('feed') i zobaczyć następną wartość (' peek'), a także możesz użyć pętli 'for' w Rubin. Jestem pewien, że istnieje lepszy sposób pisania tego, po prostu nie wiem, co próbuje zrobić. – coreyward

+0

Będziesz indeksować koniec tablicy w C, prawdopodobnie chcesz zmienić powiązanie na 'arr.Length-50'. Wydaje się to być nieco zawiłym sposobem znalezienia serii 50 lub więcej, których wartości są z epsilon wartości początkowej. – dbenhur

+0

Wydaje się, że zakładasz, że wartości przy większym indeksie nigdy nie są mniejsze niż wartości o niższym indeksie. Czy to prawda? – dbenhur

Odpowiedz

2

Innym sposobem jest użycie klasy 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 

daje

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

To jest urocze, ale nie jest równoważne z bezpośrednim przeniesieniem indeksu. Jeśli jeden iteruje przez tablicę przy pomocy i, i podejmuje decyzję, gdzie chce się awansować do indeksu j, wykonanie '(j-i) .times {iter.next}' jest bardziej skomplikowane i kosztowne niż tylko przypisanie 'i = j' – dbenhur

3

Twój przypadek nie jest łatwo objęte typowych iteratorów rubin, ale Ruby ma również zwykły podczas pętli, która może całkowicie pokryć c-for. poniższe jest równoważne pętli c dla powyższego.

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

Tak to działa, ale czy jest jakiś sposób, aby to zrobić z Enumeratorami? Myślałem o "upuszczeniu", aby obniżyć wartości między 5 a [3], ale było zagubione i zagubione, gdy zaczynam kodować. – texasbruce

Powiązane problemy