В 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
, а не к внутреннему блоку.