разрыв цикла с несколькими условиями шаг за шагом - PullRequest
0 голосов
/ 17 января 2019

Я хочу прекратить зацикливание, когда одно из моих условий выполнено, но они расположены последовательно (пошагово) и не могут быть вызваны все сразу.

Мне нужно проверить условие, затем используйте next, чтобы пропустить цикл.Код выглядит некрасиво с несколькими условиями.

array.each do |x|
          new_varible_1 = condition_1 ? func1(x) : func2(x)
          next if check_condtion_1   
          new_varible_2 = condition_2 ? func3(new_variable_1) : func4(new_variable_1)
          next if check_condtion_2 ## check_conditon_x include new_variable assigned
          new_varible_3 = condition_3 ? func5(new_variable_2) : func6(new_variable_1)
          next if check_condtion_3
          ## etc
    end

Я хочу переписать его более элегантно.Может ли это быть программируемым в динамическом подходе?

ОБНОВЛЕНО: Спасибо всем за мой вопрос новичка, но я изменил мой пример, чтобы лучше описать мой вопрос: На самом деле он требует назначения новых переменных на каждом шаге.Если check_condtion_ не удовлетворяет, я должен пропустить следующий шаг.На самом деле condition_ и function_ - это очень длинный шаг, который делает мой код очень тупым

Ответы [ 2 ]

0 голосов
/ 17 января 2019

@ kimmo-letho answer - отлично (вторая часть, где условие фактически изменено.

Я бы добавил более идиоматическую версию, просто ради полноты, а также потому, что добавить код в комментарии нелегко.

array.each do |item|
  x, _ = item
  case
  when x.nil?
    item[1] = false
  when x.respond_to?("string")
    item[1] = 'it is a string'
  end
end

С другой стороны, у меня сложилось впечатление, что вы создаете массив [x, true] вручную перед циклом. Если все, что вам нужно, это напечатать (или вернуть) предметы, которые имеют истинное состояние, вы можете сделать лучше:

# xs => [x1, x2, x3, ...]
# where your original array was [[x1, cond1], [x2, cond2], ...]
xs.reject do |x|
  x.nil? || x.respond_to?("string") || x+y[x] == 4
end

Если у вас уже было какое-то ложное состояние, и вы хотите сохранить предыдущее:

# array => [[x1, cond1], [x2, cond2], ...]
array.map do |x, cond|
  [x, cond && !(x.nil? || x.respond_to?("string") || x+y[x] == 4)]
end
0 голосов
/ 17 января 2019

Просто попробуйте найти больше хороших ответов,
Я думаю, что один из способов сделать это так:

array.each do |x, condition_| ## each element is [x, true] 
  (condition_ = false; next) if 
      x.nil? || x.respond_to?("string") || x+y[x] == 4
end

Также нет необходимости в for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...