Как пропустить несколько итераций в цикле в Ruby? - PullRequest
8 голосов
/ 29 марта 2012

Предположим, у меня есть код C ниже

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? Я знаю, что мы можем пропустить одну итерацию, используя next, но мне нужно пропустить несколько итераций в зависимости от условного значения, и я не знаю, сколько итераций пропустить до времени выполнения?


Вот код, над которым я на самом деле работаю (как упоминал Coreyward):

Я ищу "прямую линию" в массиве, значения которой отличаются менее чем на 0,1 (менее 0,1 будет считаться "прямой линией"). Диапазон должен быть больше 50, чтобы считаться длинной «линией». После того как я найду диапазон строк [a, b], я хочу пропустить итерации до верхнего предела b, чтобы он не начинался снова с a + 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 ]

3 голосов
/ 29 марта 2012

Ваш случай нелегко охватить типичными итераторами ruby, но в ruby ​​также есть обычные циклы while, которые могут полностью покрывать c-for. следующее эквивалентно вашему циклу 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
2 голосов
/ 30 марта 2012

Другим способом является использование перечислителя класса:

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>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...