Цикл for
Когда нужно выполнить одно и то же действие для каждого элемента последовательности, for循环 — именно тот инструмент, который вам нужен. YaoXiang 的 for循环设计得简洁而精确。
Основной синтаксис
Синтаксическая форма определения оператора for в грамматике:
for 'mut'? Identifier 'in' Expr BlockПеревод: начинается с for, далее может следовать необязательный mut, затем имя переменной цикла, затем in и выражение для обхода, и наконец блок кода тела цикла.
Обход числовых диапазонов
Самый распространённый способ — создать диапазон с помощью .., а затем обойти его с помощью for:
// От 0 до 4 (5 не включается)
for i in 0..5 {
print(i)
}
// Вывод: 0 1 2 3 40..5 означает диапазон от 0 (включительно) до 5 (исключительно). Это общепринятое соглашение в computer science — полуоткрытый интервал [left closed, right open).
Вы также можете использовать переменные для определения начала и конца диапазона:
start = 10
end = 15
for n in start..end {
print(n)
}
// Вывод: 10 11 12 13 14Обход списков
for不仅可以遍历数字范围,还可以直接遍历列表、数组等集合:
colors = ["Красный", "Оранжевый", "Жёлтый", "Зелёный", "Синий"]
for color in colors {
print("Текущий цвет: " + color)
}
// Вывод:
// Текущий цвет: Красный
// Текущий цвет: Оранжевый
// ... и так далееУникальная семантика for: новая привязка при каждой итерации
У цикла for в YaoXiang есть отличие от других языков: при каждой итерации создаётся новая привязка, а не изменяется одна и та же переменная.
Таблица для понимания:
| Итерация | Что происходит |
|---|---|
| 1-я | Создаётся новая привязка i = 0, выполняется тело цикла, привязка уничтожается |
| 2-я | Создаётся новая привязка i = 1 (абсолютно новая привязка), выполняется тело, затем уничтожается |
| 3-я | Создаётся новая привязка i = 2, выполняется тело, затем уничтожается |
| ... | ... |
| Конец цикла | Диапазон исчерпан, цикл завершается |
Это означает, что переменная цикла в каждой итерации — это независимый новый значение. Это очень помогает безопасности — вам не нужно беспокоиться о случайном изменении переменной цикла:
for i in 1..5 {
// i = i + 1 // Ошибка: по умолчанию неизменяемо, нельзя изменять i
print(i)
}for mut: явное объявление при необходимости изменения
Если вам действительно нужно изменять переменную цикла внутри тела (например, использовать её как аккумулятор), используйте for mut:
// С for mut разрешено изменять привязку внутри тела цикла
for mut i in 0..5 {
i = i * 2
print(i)
}
// Вывод: 0 2 4 6 8Важно: даже при использовании for mut, каждая итерация — это всё ещё новая привязка. for mut лишь делает саму новую привязку изменяемой, но не позволяет изменениям от предыдущей итерации перейти к следующей.
for mut i in 1..5 {
i = i + 100
print(i) // Каждый раз выводится 101, 102, 103, 104
}
// При каждой итерации i начинается заново со значения из диапазона, предыдущие изменения не влияют на следующую итерациюПеременные цикла не могут затенять внешние переменные
YaoXiang запрещает затенение переменных. Переменная цикла for не может иметь то же имя, что и переменная во внешней области видимости:
// Неправильный пример
i = 10
// for i in 1..5 { // Ошибка компиляции! i уже объявлена во внешней области
// print(i)
// }
// Правильный вариант — использовать другое имя
i = 10
for j in 1..5 {
print(j)
}Это правило позволяет всегда точно знать, к какой именно переменной обращается ваш код.
Сравнение с другими языками
| Язык | Семантика переменной цикла for |
|---|---|
| YaoXiang | При каждой итерации создаётся новая привязка |
| Rust | Изменяется та же переменная (нужен mut) |
| Python | Изменяется та же переменная |
| C/C++ | Изменяется та же переменная |
Подход YaoXiang ближе к человеческой интуиции — «для каждого элемента коллекции сделать что-то» — каждый элемент является независимой сущностью.
Итоги
| Пункт | Описание |
|---|---|
| Обход диапазона | for i in 0..5, полуоткрытый интервал |
| Обход коллекции | for item in list, по одному элементу |
| Семантика привязки | При каждой итерации создаётся новая привязка, а не изменяется одна и та же переменная |
| По умолчанию неизменяемо | Переменная цикла не может быть изменена, чтобы предотвратить случайности |
for mut | Явное объявление при необходимости изменения |
| Запрет затенения | Переменная цикла не может иметь то же имя, что и внешняя переменная |
В следующей главе вы изучите цикл while — стандартный способ повторения на основе условия.
