В Ruby, как мне пропустить цикл в цикле .each, аналогично 'continue'

В Ruby, как пропустить цикл в цикле .each, аналогичный continue на других языках?

Ответ 1

Используйте next:

(1..10).each do |a|
  next if a.even?
  puts a
end

печатает:

1
3   
5
7
9

Для дополнительной прохлады проверьте также redo и retry.

Работает также для таких друзей, как times, upto, downto, each_with_index, select, map и другие итераторы (и более общие блоки).

Подробнее см. http://ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UL.

Ответ 2

next - ему нравится return, но для блоков! (Таким образом, вы можете использовать это в любом proc/lambda тоже.)

Это означает, что вы также можете сказать next n "вернуть" n из блока. Например:

puts [1, 2, 3].map do |e|
  next 42 if e == 2
  e
end.inject(&:+)

Это даст 46.

Обратите внимание, что return всегда возвращается из ближайшего def и никогда не является блоком; если нет окружения def, return ing является ошибкой.

Использование return изнутри блока намеренно может запутать. Например:

def my_fun
  [1, 2, 3].map do |e|
    return "Hello." if e == 2
    e
  end
end

my_fun приведет к "Hello.", а не [1, "Hello.", 2], поскольку ключевое слово return относится к внешнему def, а не к внутреннему блоку.