Ruby: с нуля – часть 7: циклы while, for, until, break, redo и retry

ruby_logoПредыдущая часть – часть 6: условные операторы if…else, case, unless.

Оператор while

Выполняет код, пока условие истинно.

Оператор while отделяется от кода с помощью ключевого слова do, новой строки, обратного слеша или точкой с запятой.

Синтаксис:

while условие [do]
   код
end

Пример:

#!/usr/bin/ruby

$i = 0
$num = 5

while $i < $num  do
   puts("Inside the loop i = #$i" )
   $i +=1
end

Выполнение:

$ ./while.rb 
Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4

Модификатор while

Синтаксис:

код while условие

либо:

begin
  код
end while условие

В отличии от оператора while – тут код выполняется до проверки условия.

Пример:

#!/usr/bin/ruby

$i = 0
$num = 5
begin
   puts("Inside the loop i = #$i" )
   $i +=1
end while $i < $num

Результат:

$ ./while.rb 
Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4

Оператор until

Синтаксис:

until условие [do]
   код
end

Выполняет код, пока условие ложно (false). Отделяется от кода с помощью do, новой строки или точкой с запятой.

Пример:

#!/usr/bin/ruby

$i = 0
$num = 5

until $i > $num  do
   puts("Inside the loop i = #$i" )
   $i +=1;
end

Результат выполнения:

$ ./until.rb 
Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4
Inside the loop i = 5

Модификатор until

Синтаксис:

код until условие

либо:

begin
  код
end until условие

Выполняет код, пока условие ложно. Код выполняется до проверки условия.

Пример:

#!/usr/bin/ruby

$i = 0
$num = 5
begin
   puts("Inside the loop i = #$i" )
   $i +=1;
end until $i > $num

Результат:

$ ./until.rb 
Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4
Inside the loop i = 5

Оператор for

Синтаксис:

for переменная [, переменные ... ] in выражение [do]
  код
end

Выполняет код для каждого элемента в выражении.

Пример:

#!/usr/bin/ruby

for i in 0..5
   puts "Value of local variable is #{i}"
end

Тут задается диапазон значений от 1 до 5, и для каждого элемента выполняется puts.

Результат:

$ ./for.rb 
Value of local variable is 0
Value of local variable is 1
Value of local variable is 2
Value of local variable is 3
Value of local variable is 4
Value of local variable is 5

Цикл for аналогичен такой форме записи:

(выражение).each do |переменная[, переменная...]| код end

Цикл for может быть отделен от кода с помощью ключевого слова do, новой строки или точки с запятой.

Еще один пример:

#!/usr/bin/ruby

(0..5).each do |i|
   puts "Value of local variable is #{i}"
end

Оператор break

Прерывает выполнение цикла. Например:

#!/usr/bin/ruby

for i in 0..5
   if i > 2 then
      break
   end
   puts "Value of local variable is #{i}"
end

Результат:

$ ./break.rb 
Value of local variable is 0
Value of local variable is 1
Value of local variable is 2

Оператор next

Прерывает выполнение текущего цикла, и переключается на следующий. Например:

#!/usr/bin/ruby

for i in 0..5
   if i <= 2 then
      next
   end
   puts "Value of local variable is #{i}"
end

Результат:

$ ./next.rb 
Value of local variable is 3
Value of local variable is 4
Value of local variable is 5

Оператор redo

Запускает цикл заново, например:

#!/usr/bin/ruby

for i in 0..5
   if i < 2 then
      puts "Value of local variable is #{i}"
      redo
   end
end

Результат:

$ ./redo.rb
Value of local variable is 0
Value of local variable is 0
Value of local variable is 0
Value of local variable is 0
Value of local variable is 0
...

Оператор retry

При использовании retry в блоке begin/rescue/end – вызовет выполнеине кода в begin сначала:

begin
   do_something # exception raised
rescue
   # handles error
   retry  # restart from beginning
end

Пример:

#!/usr/bin/env ruby

$a = 1

begin
  file = File.open('test.fle', 'r')
rescue Errno::ENOENT
  puts "No file found, attempt #{$a}"
  $a += 1
  retry if $a <= 5
end

Результат выполнения:

$ ./retry.rb 
No file found, attempt 1
No file found, attempt 2
No file found, attempt 3
No file found, attempt 4
No file found, attempt 5