Протокол обобщённого for
Изучите протокол итератора с тремя значениями: функция-итератор, состояние и управляющая переменная.
«Протокол обобщённого for» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Как работает обобщённый for
Инструкция for вызывает функцию-итератор на каждой итерации. Она передаёт состояние и управляющую переменную и останавливается, когда функция возвращает nil.
Возврат трёх значений
for var in iter, state, init do — Lua распаковывает это как: функцию-итератор iter, неизменяемое состояние state и начальную управляющую переменную init.
Протокол ipairs
ipairs(t) возвращает функцию-итератор без состояния, таблицу в качестве состояния и 0 в качестве начальной управляющей переменной. Каждый вызов возвращает следующий индекс и значение.
for i, v in ipairs({10, 20, 30}) do
print(i, v)
endПользовательский итератор с тремя значениями
Реализуйте пользовательский итератор без состояния, явно предоставив все три значения.
local function iter(t, i)
i = i + 1
local v = t[i]
if v then return i, v end
end
for i, v in iter, {"a","b","c"}, 0 do
print(i, v)
endУпрощение с помощью замыкания
Итератор на основе замыкания должен возвращать только функцию-итератор: состояние и управляющая переменная не нужны, поскольку они находятся во внешних переменных.
local function values(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
for v in values({1,2,3}) do print(v) endnil завершает цикл
Обобщённый цикл for завершается сразу после того, как функция-итератор возвращает nil в качестве первого возвращаемого значения. Это условие завершения.
Несколько возвращаемых значений
Итератор может возвращать несколько значений; каждое соответствует переменной цикла: for k, v in pairs(t).
for k, v in pairs({x=1, y=2}) do
print(k, v)
endИспользование параметра состояния
Параметр состояния передаётся без изменений при каждом вызове итератора. Для итераторов без состояния он содержит весь необходимый контекст, например саму таблицу.
Coroutine.wrap как итератор
coroutine.wrap(fn) возвращает функцию, возобновляющую сопрограмму при каждом вызове; выданные значения становятся возвращаемыми — это идеально подходит для итератора обобщённого for.
local function countdown(n)
return coroutine.wrap(function()
for i = n, 1, -1 do coroutine.yield(i) end
end)
end
for v in countdown(5) do print(v) endКомпозиция итераторов
Итераторы можно компоновать: оборачивайте один итератор в другой, чтобы добавить фильтрацию или преобразование.
local function mapped(iter, fn)
return function()
local v = iter()
if v ~= nil then return fn(v) end
end
endБесконечные итераторы
Итератор, который никогда не возвращает nil, создаёт бесконечный цикл. Всегда задавайте условие завершения или используйте break.
local function naturals()
local n = 0
return function() n = n+1; return n end
end
for v in naturals() do
if v > 5 then break end
print(v)
endВопрос об обобщённом for
Когда останавливается обобщённый цикл for?
Итоги: протокол обобщённого for
Обобщённый for вызывает функцию-итератор с неизменяемыми состоянием и управляющей переменной. Он останавливается при получении nil. Замыкания упрощают итераторы с состоянием, кодируя состояние во внешних переменных.
Часто задаваемые вопросы
Урок «Протокол обобщённого for» бесплатный?
Да — полный текст урока «Протокол обобщённого for» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Протокол обобщённого for»?
Изучите протокол итератора с тремя значениями: функция-итератор, состояние и управляющая переменная. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Протокол обобщённого for»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Протокол обобщённого for
- Итераторы без состояния
- Итераторы с состоянием и замыканиями
- Генераторы на основе сопрограмм