Циклы в Ruby используются для выполнения одного и того же блока кода определенное количество раз. В этой главе описываются все операторы цикла, поддерживаемые Ruby.
while conditional [do] code end
Выполняет code, пока if равно true. Цикл while отделен от code зарезервированным словом do, символом новой строки, обратным слэшем \ или точкой с запятой;.
#!/usr/bin/ruby $i = 0 $num = 5 while $i < $num do puts("Внутри цикла i = #$i" ) $i +=1 end
Это приведет к следующему результату:
Внутри цикла i = 0 Внутри цикла i = 1 Внутри цикла i = 2 Внутри цикла i = 3 Внутри цикла i = 4
code while condition OR begin code end while conditional
Выполняет code, пока while равно true.
Если модификатор while следует за инструкцией begin без каких- либо аварийных или обязательных условий, code выполняется один раз перед вычислением условного выражения.
#!/usr/bin/ruby $i = 0 $num = 5 begin puts("Внутри цикла i = #$i" ) $i +=1 end while $i < $num
Это приведет к следующему результату:
Внутри цикла i = 0 Внутри цикла i = 1 Внутри цикла i = 2 Внутри цикла i = 3 Внутри цикла i = 4
until conditional [do] code end
Выполняет code, а while — false. Утверждение until условно отделяются от code зарезервированным словом do, переводом строкой или точкой с запятой.
#!/usr/bin/ruby $i = 0 $num = 5 until $i > $num do puts("Внутри цикла i = #$i" ) $i +=1; end
Это приведет к следующему результату:
Внутри цикла i = 0 Внутри цикла i = 1 Внутри цикла i = 2 Внутри цикла i = 3 Внутри цикла i = 4 Внутри цикла i = 5
code until conditional OR begin code end until conditional
Выполняет code, пока until — false.
Если модификатор until не будет следовать за инструкцией begin без каких- либо действий, code выполняется один раз перед вычислением выражения conditional.
#!/usr/bin/ruby $i = 0 $num = 5 begin puts("Внутри цикла i = #$i" ) $i +=1; end until $i > $num
Это приведет к следующему результату:
Внутри цикла i = 0 Внутри цикла i = 1 Внутри цикла i = 2 Внутри цикла i = 3 Внутри цикла i = 4 Внутри цикла i = 5
for variable [, variable ...] in expression [do] code end
Выполняет code один раз для каждого элемента в expression.
#!/usr/bin/ruby for i in 0..5 puts "Значение локальной переменной #{i}" end
Здесь мы определили диапазон 0..5. Заявление для i в 0..5 позволит iпринимать значения в диапазоне от 0 до 5 (включая 5). Это приведет к следующему результату:
Значение локальной переменной 0 Значение локальной переменной 1 Значение локальной переменной 2 Значение локальной переменной 3 Значение локальной переменной 4 Значение локальной переменной 5
A for … in loop почти точно эквивалентно следующему:
(expression).each do |variable[, variable...]| code end
за исключением того, что цикл for не создает новую область для локальных переменных. Для передачи контура в выражении отделен от code зарезервированным словом do, переводом строки или точкой с запятой.
#!/usr/bin/ruby (0..5).each do |i| puts "Значение локальной переменной #{i}" end
Это приведет к следующему результату:
Значение локальной переменной 0 Значение локальной переменной 1 Значение локальной переменной 2 Значение локальной переменной 3 Значение локальной переменной 4 Значение локальной переменной 5
break
Завершает самый внутренний цикл. Завершает метод с ассоциированным блоком, если он вызван внутри блока (с возвратом метода nil).
#!/usr/bin/ruby for i in 0..5 if i > 2 then break end puts "Значение локальной переменной #{i}" end
Это приведет к следующему результату:
Значение локальной переменной 0 Значение локальной переменной 1 Значение локальной переменной 2
next
Переход к следующему циклу внутри цикла. Завершает выполнение блока, если он вызван внутри блока (с выходом или возвратом вызова nil).
#!/usr/bin/ruby for i in 0..5 if i < 2 then next end puts "Значение локальной переменной #{i}" end
Это приведет к следующему результату:
Значение локальной переменной 2 Значение локальной переменной 3 Значение локальной переменной 4 Значение локальной переменной 5
redo
Перезапускает цикл самого внутреннего цикла, не проверяя условия цикла. Перезапускает yield или call, если вызывается внутри блока.
#!/usr/bin/ruby for i in 0..5 if i < 2 then puts "Значение локальной переменной #{i}" redo end end
Это приведет к следующему результату и пойдет в бесконечном цикле:
Значение локальной переменной 0 Значение локальной переменной 0 ............................
retry
Если в предложении rescue выражения begin отображается retry, перезапустите программу с начала тела begin.
begin do_something # exception raised rescue # handles error retry # restart from beginning end
Если в цикле отображается retry, блок или тело выражения for перезапускает вызов вызова цикла. Аргументы цикла повторно вычисляются.
for i in 1..5 retry if some_condition # restart from i == 1 end
#!/usr/bin/ruby for i in 0..5 retry if i > 2 puts "Значение локальной переменной #{i}" end
Это приведет к следующему результату и пойдет в бесконечном цикле:
Значение локальной переменной 1 Значение локальной переменной 2 Значение локальной переменной 1 Значение локальной переменной 2 Значение локальной переменной 1 Значение локальной переменной 2 ............................