English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Циклы в Ruby используются для выполнения одного и того же блока кода несколько раз. В этой главе мы детально рассмотрим все циклические операторы, поддерживаемые Ruby.
while условие [do] code end
или
while условие [:] code end
когда условие выполнить, если истина code.
в грамматике слова do или : можно опустить. Но если нужно написать выражение while на одной строке, то условие или блок кода необходимо разделить словами do или :.
#!/usr/bin/ruby # -*- coding: UTF-8 -*- $i = 0 $num = 5 while $i < $num do puts("В выражении цикла i = #$i") $i +=1 end
Результат выполнения примера:
В выражении цикла i = 0 В выражении цикла i = 1 В выражении цикла i = 2 В выражении цикла i = 3 В выражении цикла i = 4
код while условие или begin code конец while условие
когда условие выполнить, если истина code.
если while модификатор следует за rescue или в ensure-подзадаче begin выраженияcode после условие выполнить до выполнения условия.
#!/usr/bin/ruby # -*- coding: UTF-8 -*- $i = 0 $num = 5 begin puts("В выражении цикла i = #$i") $i +=1 конец while $i < $num
Результат выполнения примера:
В выражении цикла i = 0 В выражении цикла i = 1 В выражении цикла i = 2 В выражении цикла i = 3 В выражении цикла i = 4
до тех пор, пока условие [do] code end
когда условие выполнить, если ложно code.
в грамматике слово do можно опустить. Но если нужно написать выражение until на одной строке, то условие или блок кода необходимо разделить словами do.
#!/usr/bin/ruby # -*- coding: UTF-8 -*- $i = 0 $num = 5 до тех пор, пока $i > $num puts("В выражении цикла i = #$i") $i +=1; end
Результат выполнения примера:
В выражении цикла i = 0 В выражении цикла i = 1 В выражении цикла i = 2 В выражении цикла i = 3 В выражении цикла i = 4 В выражении цикла i = 5
code until условие или begin code end until условие
когда условие когда false code.
если until модификатор следует за rescue или в ensure-подзадаче begin выраженияcode после условие выполнить до выполнения условия.
#!/usr/bin/ruby # -*- coding: UTF-8 -*- $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
Сначала вычисляется выражение и получается объект, затем для expression Каждый элемент выполняется по одному. code.
#!/usr/bin/ruby # -*- coding: UTF-8 -*- for i in 0..5 puts "Значение локальной переменной равно #{i}" end
Здесь мы уже определили диапазон 0..5. Строка for i in 0..5 позволяет значению i варьироваться от 0 до 5 (включая 5).
Результат выполнения примера:
значение локальной переменной равно 0 Значение локальной переменной равно 1 Значение локальной переменной равно 2 значение локальной переменной равно 3 значение локальной переменной равно 4 значение локальной переменной равно 5
for...in Цикл почти полностью эквивалентен:
(expression).each do |variable[, variable...]| code end
Но for-цикл не создает нового областью действия для локальных переменных.
В грамматике do можно опустить, но для записи for-выражения на одной строке необходимо использовать do для разделения условия или блока кода.
#!/usr/bin/ruby # -*- coding: UTF-8 -*- (0..5).each do |i| puts "Значение локальной переменной равно #{i}" end
Результат выполнения примера:
значение локальной переменной равно 0 Значение локальной переменной равно 1 Значение локальной переменной равно 2 значение локальной переменной равно 3 значение локальной переменной равно 4 значение локальной переменной равно 5
break
TERMINATE наиболее внутренний цикл. Если вызывается в блоке, то метод, связанный с блоком, также будет остановлен (метод возвращает nil).
#!/usr/bin/ruby # -*- coding: UTF-8 -*- for i in 0..5 if i > 2 then break end puts "Значение локальной переменной равно #{i}" end
Результат выполнения примера:
значение локальной переменной равно 0 Значение локальной переменной равно 1 Значение локальной переменной равно 2
next
Перейти к следующей итерации цикла. Если вызывается в блоке, то выполнение блока终止ы (yield выражение возвращает nil).
#!/usr/bin/ruby # -*- coding: UTF-8 -*- for i in 0..5 if i < 2 then next end puts "Значение локальной переменной равно #{i}" end
Результат выполнения примера:
Значение локальной переменной равно 2 значение локальной переменной равно 3 значение локальной переменной равно 4 значение локальной переменной равно 5
redo
заново начать текущий цикл внутреннего цикла, не проверяя условия цикла. Если вызывается в блоке, то процесс начинается заново yield или call.
#!/usr/bin/ruby # -*- coding: UTF-8 -*- for i in 0..5 if i < 2 then puts "Значение локальной переменной равно #{i}" redo end end
Это приведет к следующим результатам и будет входить в бесконечный цикл:
значение локальной переменной равно 0 значение локальной переменной равно 0 ............................
注意: версии 1.9 и выше не поддерживают использование retry в циклах.
retry
если retry Если rescue出现在begin выражения, то процесс начинается заново с начала主体的 begin.
begin do_something # Выброшенная исключение rescue # Обработка ошибок retry # Начать заново с begin end
Если retry出现在 итерации, блоке или теле выражения for, то итерация начнется заново. Параметры итерации будут заново оценены.
for i in 1..5 retry if some_condition # Начать заново с i == 1 end
#!/usr/bin/ruby # -*- coding: UTF-8 -*- for i in 1..5 retry if i > 2 puts "Значение локальной переменной равно #{i}" end
Это приведет к следующим результатам и будет входить в бесконечный цикл:
Значение локальной переменной равно 1 Значение локальной переменной равно 2 Значение локальной переменной равно 1 Значение локальной переменной равно 2 Значение локальной переменной равно 1 Значение локальной переменной равно 2 ............................