0Pricing
Lua Academy · Урок

Функции-фабрики и генераторы

Используйте замыкания как функции-фабрики для создания настроенных экземпляров функций.

«Функции-фабрики и генераторы» — бесплатный урок 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 — локальная установка не требуется.

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

  1. Что такое внешние значения?
  2. Общие внешние значения замыканий
  3. Функции-фабрики и генераторы
  4. Мемоизация с замыканиями
← Назад к Lua Academy