Итераторы без состояния
Пишите итераторы без состояния, такие как ipairs, и создавайте их варианты.
«Итераторы без состояния» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое итератор без состояния
Итератор без состояния не хранит внутреннее состояние. Вся информация передаётся аргументами при каждом вызове: неизменяемое состояние и текущая управляющая переменная.
ipairs: классический пример
ipairs не хранит состояния: он использует таблицу как состояние, а текущий индекс — как управляющую переменную.
local function myIpairs(t, i)
i = i + 1
local v = t[i]
if v ~= nil then return i, v end
end
-- Use: for i,v in myIpairs, t, 0 doИтератор squares
Итератор без состояния, возвращающий последовательные квадраты. Состояние хранит предел, а управляющая переменная содержит текущее число.
local function squaresIter(max, n)
n = n + 1
if n <= max then return n, n*n end
end
for n, sq in squaresIter, 5, 0 do
print(n, sq)
endЗамыкание не требуется
Итераторы без состояния не требуют создания замыканий. Поскольку всё состояние передаётся аргументами, на каждой итерации не выделяется память в куче.
Реализация итератора в стиле pairs
Итератор пар ключ-значение без состояния использует next как функцию-итератор — именно так работает pairs.
for k, v in next, {a=1, b=2} do
print(k, v)
endФункция next
next(t, k) возвращает следующую пару ключ-значение после ключа k. Передайте nil (или не передавайте аргумент), чтобы начать с начала.
local t = {x=10, y=20}
local k, v = next(t, nil)
print(k, v)
k, v = next(t, k)
print(k, v)Пользовательский итератор диапазона
Итератор диапазона без состояния с шагом. Состояние хранит таблицу настроек, а управляющая переменная содержит текущее значение.
local function rangeIter(state, n)
n = n + state.step
if n <= state.limit then return n end
end
for v in rangeIter, {limit=10, step=2}, 0 do
print(v)
endПреимущество производительности
Итераторы без состояния идеально подходят для тесных циклов. При каждом вызове замыкание не создаётся, поэтому для простых обходов они быстрее итераторов-замыканий с состоянием.
Ограничения
Когда итерации требуется сложное состояние (несколько счётчиков, очереди или динамические данные), итераторы без состояния становятся неудобными. Вместо них используйте итераторы-замыкания с состоянием или сопрограммы.
Объединение с table.move
Итератор среза без состояния возвращает элементы из среза таблицы. Неизменяемое состояние содержит массив и конечный индекс, а управляющая переменная — текущий индекс.
Итераторы без состояния стандартной библиотеки
ipairs, pairs (через next) и string.gmatch внутри используют конструкции без состояния или почти без состояния.
Вопрос об итераторе без состояния
Что делает итератор итератором без состояния?
Итоги: итераторы без состояния
Итераторы без состояния получают весь контекст в аргументах, не требуют создания замыканий и отличаются высокой производительностью. Они идеально подходят для простых последовательных обходов, например индексации массива.
Часто задаваемые вопросы
Урок «Итераторы без состояния» бесплатный?
Да — полный текст урока «Итераторы без состояния» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Итераторы без состояния»?
Пишите итераторы без состояния, такие как ipairs, и создавайте их варианты. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Итераторы без состояния»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Протокол обобщённого for
- Итераторы без состояния
- Итераторы с состоянием и замыканиями
- Генераторы на основе сопрограмм