0Pricing
Lua Academy · Урок

Итераторы без состояния

Пишите итераторы без состояния, такие как 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 — локальная установка не требуется.

Все уроки этого курса

  1. Протокол обобщённого for
  2. Итераторы без состояния
  3. Итераторы с состоянием и замыканиями
  4. Генераторы на основе сопрограмм
← Назад к Lua Academy