Циклы в Ruby — это управляющие конструкции, которые позволяют повторять выполнение блока кода многократно, пока выполняется определённое условие или для каждого элемента коллекции.
Выполняется пока условие истинно:
counter = 0
while counter < 5
puts "Итерация #{counter}"
counter += 1
end
Особенности:
Выполняется пока условие ложно (противоположность while
):
counter = 0
until counter >= 5
puts "Итерация #{counter}"
counter += 1
end
Выполняется бесконечно, пока не встретит break
:
counter = 0
loop do
puts "Итерация #{counter}"
counter += 1
break if counter >= 5
end
Редко используется в Ruby (предпочтительнее итераторы):
for i in 0..4
puts "Итерация #{i}"
end
(0..4).each do |i|
puts "Итерация #{i}"
end
5.times do |i|
puts "Итерация #{i}"
end
0.upto(4) { |i| puts "Up: #{i}" }
4.downto(0) { |i| puts "Down: #{i}" }
break
— немедленный выход из циклаnext
— переход к следующей итерацииredo
— повтор текущей итерацииretry
— перезапуск цикла (в современных версиях Ruby заменён на begin/rescue
)Пример:
(0..5).each do |i|
next if i == 2 # Пропустит итерацию с i=2
break if i == 4 # Выйдет при i=4
puts i
end
['a', 'b', 'c'].each_with_index do |item, index|
puts "#{index}: #{item}"
end
(1..5).each_with_object([]) do |i, arr|
arr << i * 2
end
# => [2, 4, 6, 8, 10]
0.step(10, 2) { |i| puts i } # 0, 2, 4, 6, 8, 10
lazy
для обработки больших коллекцийПример ленивых вычислений:
(1..Float::INFINITY).lazy
.select(&:odd?)
.take(5)
.to_a
# => [1, 3, 5, 7, 9]
while
/until
обычно быстрее итераторов для простых переборовeach
, чем for
Резюмируем: Ruby предлагает богатый набор конструкций для организации циклов — от традиционных while/for
до выразительных итераторов. Идиоматичный Ruby код предпочитает итераторы (each
, times
, map
и др.) классическим циклам, так как они безопаснее, выразительнее и лучше интегрированы в экосистему языка. Понимание нюансов работы разных видов циклов позволяет писать более эффективный и читаемый код.