Как выйти из оператора if в цикле for - PullRequest
0 голосов
/ 27 октября 2018

Я перебираю массив, и внутри меня есть оператор if.

[1, 2, 3, 4, 5, 6, 7, 8, 9].each do |i|
  if i == 4
    p i
    break
  end
  if i > 6
    p i
  end
end

Я хочу напечатать i, если i == 4, и прервать, но все же перейти ко второму оператору if. Как выйти из оператора if, но не из цикла for, все еще выполняя оставшийся код после блока if?

В моем реальном сценарии у меня есть матрица:

  1     2     3     4     5 
  _     ♙     _     9     _ 
 11    12    13    14    15 
 16     _    18    19    20 
 21    22    23    24     _ 

Скажите, что мой текущий поз [1][1]. Когда я проверяю свой следующий элемент (row + i, col), я хочу увеличить значение. Но когда я сталкиваюсь с '_', скажем [3][1], я должен закончить с if оператором.

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Под "прерыванием от if" вы, возможно, подразумеваете "прерывание выполнения тела if"?

if condition
  puts 'doing something'
  # "break" here
  puts 'doing something else'
end

Если это так, это можно сделать так:

catch(:break_from_if) do
  if condition
    puts 'doing something'
    throw :break_from_if
    puts 'doing something else'
  end
end

Обратите внимание, что глагол: можно сделать , но не следует делать (в коде, который имеет какое-либо значение)

0 голосов
/ 27 октября 2018

Может быть, я что-то упустил.К сожалению, я не совсем уверен, что понимаю ваш вопрос и терминологию, которую вы используете.Следующее гарантирует, что 'i> 6' не имеет побочных эффектов, в том же блоке if мы выполняем следующую проверку с помощью elsif.Здесь вы хотите эффект, который вы перемещаете на следующий пункт в списке, если я правильно понимаю.Вы можете сделать это с помощью команды «next».

[1,2,3,4,5,6,7,8,9].each do |i|
  if i > 6
    p i
  elsif i == 4
    p i
    next
  end
end

end

0 голосов
/ 27 октября 2018

Я знаю, что простое исправление - просто удалить разрыв. Но главный вопрос в том, как мне выйти из одного оператора if и перейти к второму оператору if.

Удалить break.

Нет необходимости break из if утверждений. Они не петли. Если условие истинно, они запускают свой блок кода один раз, а затем продолжают работу.

this = 42

if this < 40
  p "less than 42"
end

if this > 40
  p "greater than 40"
end

p "after the ifs"

Это напечатает.

"greater than 40"
"after the ifs"
...