Функции-фабрики и генераторы
Используйте замыкания как функции-фабрики для создания настроенных экземпляров функций.
«Функции-фабрики и генераторы» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое фабричная функция
Фабричная функция — это функция, которая создаёт и возвращает другие функции, настроенные с помощью её аргументов и внешних переменных.
Простая фабрика множителей
Каждый вызов multiplier возвращает новое замыкание, захватывающее другое значение factor.
local function multiplier(factor)
return function(x) return x * factor end
end
local double = multiplier(2)
local triple = multiplier(3)
print(double(5)) -- 10
print(triple(5)) -- 15Настраиваемая фабрика журналирования
Фабрика журналирования захватывает строку-префикс и возвращает функцию записи в журнал.
local function makeLogger(prefix)
return function(msg)
print("[" .. prefix .. "] " .. msg)
end
end
local info = makeLogger("INFO")
local warn = makeLogger("WARN")
info("started")
warn("low memory")Генератор счётчика
Генератор хранит внутреннее состояние и при каждом вызове выдаёт новое значение.
local function counter(start, step)
local n = start - step
return function()
n = n + step
return n
end
end
local evens = counter(0, 2)
print(evens(), evens(), evens()) -- 0 2 4Генератор диапазона
Генератор диапазона выдаёт значения от from до to, а после исчерпания возвращает nil.
local function range(from, to, step)
step = step or 1
local i = from - step
return function()
i = i + step
if i <= to then return i end
end
end
for v in range(1, 5) do print(v) endЧастичное применение
Фабрика частично применяет аргументы, создавая специализированную версию функции.
local function partial(fn, ...)
local args = {...}
return function(...)
local all = {table.unpack(args)}
for _, v in ipairs({...}) do all[#all+1] = v end
return fn(table.unpack(all))
end
end
local add = function(a,b) return a+b end
local add10 = partial(add, 10)
print(add10(5)) -- 15Мемоизирующая фабрика
Фабрика может создать мемоизированную версию ресурсоёмкой функции.
local function memoize(fn)
local cache = {}
return function(x)
if cache[x] == nil then cache[x] = fn(x) end
return cache[x]
end
endЛексер с состоянием
Фабрика лексера захватывает входную строку и позицию, выдавая следующий токен при каждом вызове.
local function lexer(input)
local pos = 1
return function()
if pos > #input then return nil end
local token = input:match("%S+", pos)
if token then pos = pos + #token + 1 end
return token
end
endГенераторы и сопрограммы
Генераторы на основе замыканий проще, но хранят всё состояние во внешних переменных. Генераторы на основе сопрограмм мощнее: они позволяют использовать yield в любой части сложной логики.
Шаблоны функций
Фабрики создают шаблоны функций — распространённые шаблоны, параметры которых задаются при создании, после чего их можно многократно использовать с разными настройками.
Каррирование
Каррированная функция принимает аргументы по одному и возвращает новую функцию, пока не будут переданы все аргументы.
local function curry2(fn)
return function(a)
return function(b)
return fn(a, b)
end
end
end
local curriedAdd = curry2(function(a,b) return a+b end)
print(curriedAdd(3)(4)) -- 7Вопрос о фабриках
Какова ключевая особенность фабричных функций?
Итоги: фабричные функции
Фабричные функции создают настроенные замыкания, поддерживая частичное применение, генераторы, мемоизацию и каррирование. Это один из самых мощных функциональных шаблонов Lua.
Часто задаваемые вопросы
Урок «Функции-фабрики и генераторы» бесплатный?
Да — полный текст урока «Функции-фабрики и генераторы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Функции-фабрики и генераторы»?
Используйте замыкания как функции-фабрики для создания настроенных экземпляров функций. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Функции-фабрики и генераторы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое внешние значения?
- Общие внешние значения замыканий
- Функции-фабрики и генераторы
- Мемоизация с замыканиями