Skip to content

Цикл for

Когда нужно выполнить одно и то же действие для каждого элемента последовательности, for循环 — именно тот инструмент, который вам нужен. YaoXiang 的 for循环设计得简洁而精确。

Основной синтаксис

Синтаксическая форма определения оператора for в грамматике:

for 'mut'? Identifier 'in' Expr Block

Перевод: начинается с for, далее может следовать необязательный mut, затем имя переменной цикла, затем in и выражение для обхода, и наконец блок кода тела цикла.

Обход числовых диапазонов

Самый распространённый способ — создать диапазон с помощью .., а затем обойти его с помощью for:

yaoxiang
// От 0 до 4 (5 не включается)
for i in 0..5 {
    print(i)
}
// Вывод: 0 1 2 3 4

0..5 означает диапазон от 0 (включительно) до 5 (исключительно). Это общепринятое соглашение в computer science — полуоткрытый интервал [left closed, right open).

Вы также можете использовать переменные для определения начала и конца диапазона:

yaoxiang
start = 10
end = 15
for n in start..end {
    print(n)
}
// Вывод: 10 11 12 13 14

Обход списков

for不仅可以遍历数字范围,还可以直接遍历列表、数组等集合:

yaoxiang
colors = ["Красный", "Оранжевый", "Жёлтый", "Зелёный", "Синий"]

for color in colors {
    print("Текущий цвет: " + color)
}
// Вывод:
// Текущий цвет: Красный
// Текущий цвет: Оранжевый
// ... и так далее

Уникальная семантика for: новая привязка при каждой итерации

У цикла for в YaoXiang есть отличие от других языков: при каждой итерации создаётся новая привязка, а не изменяется одна и та же переменная.

Таблица для понимания:

ИтерацияЧто происходит
1-яСоздаётся новая привязка i = 0, выполняется тело цикла, привязка уничтожается
2-яСоздаётся новая привязка i = 1 (абсолютно новая привязка), выполняется тело, затем уничтожается
3-яСоздаётся новая привязка i = 2, выполняется тело, затем уничтожается
......
Конец циклаДиапазон исчерпан, цикл завершается

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

yaoxiang
for i in 1..5 {
    // i = i + 1   // Ошибка: по умолчанию неизменяемо, нельзя изменять i
    print(i)
}

for mut: явное объявление при необходимости изменения

Если вам действительно нужно изменять переменную цикла внутри тела (например, использовать её как аккумулятор), используйте for mut:

yaoxiang
// С for mut разрешено изменять привязку внутри тела цикла
for mut i in 0..5 {
    i = i * 2
    print(i)
}
// Вывод: 0 2 4 6 8

Важно: даже при использовании for mut, каждая итерация — это всё ещё новая привязка. for mut лишь делает саму новую привязку изменяемой, но не позволяет изменениям от предыдущей итерации перейти к следующей.

yaoxiang
for mut i in 1..5 {
    i = i + 100
    print(i)        // Каждый раз выводится 101, 102, 103, 104
}
// При каждой итерации i начинается заново со значения из диапазона, предыдущие изменения не влияют на следующую итерацию

Переменные цикла не могут затенять внешние переменные

YaoXiang запрещает затенение переменных. Переменная цикла for не может иметь то же имя, что и переменная во внешней области видимости:

yaoxiang
// Неправильный пример
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 — стандартный способ повторения на основе условия.