Ци

Цикли while у Crystal

1 вправа

Про концепцію Цикли while

Цикл як керувальна конструкція дає змогу виконувати код повторно, доки виконується певна умова.

Цикли while

Цикл while як керувальна конструкція дає змогу виконувати код повторно, доки виконується певна умова. Код усередині циклу while виконується доти, доки умова дає правдиве значення. Цикли while часто використовують, коли кількість ітерацій заздалегідь невідома, але їх можна застосовувати в будь-якій ситуації, де потрібен цикл.

Умова перевіряється перед виконанням коду всередині циклу, тож якщо умова хибна, код у циклі не виконається жодного разу.

i = 0
while i < 3
  puts i
  i += 1
end

# Output:
# 0
# 1
# 2

Щоб перебрати символи рядка тексту (англ. string), можна пройтися циклом по довжині цього рядка тексту.

str = "Hello"
i = 0
while i < str.size
  puts str[i]
  i += 1
end

# Output:
# H
# e
# l
# l
# o

Цикли until

Цикли until працюють так само, як цикли while, з однією відмінністю: код у циклі виконується доти, доки умова не дасть правдивого значення. Це та сама різниця, що й між if та unless.

i = 0
until i == 3
  puts i
  i += 1
end

Нескінченні цикли

З циклами while часто трапляється така помилка: програма потрапляє в «нескінченний цикл», який ніколи не завершується. Нескінченний цикл виникає, коли умова ніколи не дає потрібного правдивого чи неправдивого значення. Найчастіше причина в помилці програміста, наприклад, коли забувають збільшити змінну циклу. Але іноді нескінченний цикл є найзрозумілішим способом реалізувати логіку програми. Або ж цикл справді мусить тривати вічно. Наприклад, HTTP-сервер чекає на вхідне зʼєднання, обробляє його, а тоді чекає на наступне.

Break

Ключове слово break дає змогу вийти з циклу достроково. Це зручно, коли за певних умов потрібно завершити цикл раніше.

i = 0
while i <= 3
  puts i
  i += 1
  if i == 2
    break
  end
end

# Output:
# 0
# 1

Next

Ключове слово next дає змогу перейти до наступної ітерації циклу. Це зручно, коли деякі ітерації циклу потрібно пропустити.

i = 0
while i <= 3
  i += 1
  if i == 2
    next
  end
  puts i
end

# Output:
# 1
# 3

Типи в циклі

Тип змінної в циклі може змінюватися. У прикладі нижче тип a дорівнює Int32 | String, бо в першій частині циклу змінна може містити Int32 або String. Змінна a матиме тип Int32 | String лише в першій частині циклу, адже на початку циклу вона містить Int32, а на другій ітерації вже String. Про цю систему з кількома типами ми детально поговоримо пізніше. Але оскільки ми впевнені, що в другій частині циклу змінна міститиме лише String, тип a у другій частині циклу дорівнює String. Під час виконання вона ніколи не міститиме Int32 і String одночасно.

i = 0
a = 4
while i < 3
  p typeof(a)
  # => Int32 | String
  a = "4"
  p typeof(a)
  # => String
  i += 1
end

while як вираз

while можна використати як вираз, тобто як значення змінної. Повертається значення, передане разом із ключовим словом break. Значення останнього виразу в циклі не повертається.

a = while true
  break 1
end

p a
# => 1

i = 0
a = while i == 0
  i += 1
  1
end

p a
# => nil
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Цикли while

Практика заблокована

Розблокуйте ще 10 вправ, щоб практикувати концепцію Цикли while