English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Учебник по Ruby для начинающих

Учебник по Ruby для продвинутых

Циклы Ruby

Циклы в Ruby используются для выполнения одного и того же блока кода несколько раз. В этой главе мы детально рассмотрим все циклические операторы, поддерживаемые Ruby.

Ruby while выражение

грамматика

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

Ruby while модификатор

грамматика

код 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

Ruby until выражение

грамматика

до тех пор, пока условие [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

Ruby until модификатор

грамматика

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

Ruby for выражение

грамматика

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

Ruby break выражение

грамматика

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

Ruby next выражение

грамматика

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

Ruby redo выражение

грамматика

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
............................

Ruby retry выражение

注意: версии 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
............................