0Pricing
Lua Academy · Урок

Функции как значения

Сохраняйте функции и передавайте их.

«Функции как значения» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Функции — значения первого класса

В Lua функции являются значениями первого класса. Это означает, что функция — всего лишь данные: Вы можете сохранить её в переменной, передать другой функции, вернуть её и хранить в таблице.

Эта простая идея лежит в основе функционального программирования. Если обращаться с функциями так же, как с числами или строками, можно создавать гибкие и повторно используемые инструменты.

Сохранение функции в переменной

Имя, которое Вы даёте функции, на самом деле является переменной, содержащей значение функции. Это значение можно свободно присвоить другой переменной.

Оба имени ниже указывают на одну и ту же функцию, поэтому вызов любого из них выполняет один и тот же код.

local function greet(name)
  return "Hello, " .. name
end

local hi = greet
print(greet("Ada"))
print(hi("Lin"))

Анонимные функции

Для создания функции не обязательно давать ей имя. Анонимная функция записывается с помощью синтаксиса function ... end и используется непосредственно как значение.

Присваивание анонимной функции локальной переменной эквивалентно обычному определению функции, только записанному непосредственно в нужном месте.

local square = function(x)
  return x * x
end

print(square(5))
print(square(9))

Функции как аргументы

Поскольку функции являются значениями, их можно передавать другим функциям. Функция, принимающая другую функцию, называется функцией высшего порядка.

Здесь apply не знает, какую работу выполнять, пока Вы не передадите ей функцию для запуска.

local function apply(f, x)
  return f(x)
end

local function double(n) return n * 2 end

print(apply(double, 10))
print(apply(function(n) return n + 1 end, 10))

Возврат функции

Функция может возвращать другую функцию. Это позволяет создавать функции по требованию, настраивая их переданными аргументами.

Ниже multiplier каждый раз создаёт совершенно новую функцию, которая запоминает переданный ей множитель.

local function multiplier(factor)
  return function(x)
    return x * factor
  end
end

local triple = multiplier(3)
print(triple(4))
print(multiplier(10)(5))

Замыкания захватывают переменные

Когда возвращённая функция использует локальную переменную из окружающей функции, она захватывает эту переменную. Пара из функции и захваченных переменных называется замыканием.

Захваченный factor продолжает существовать всё время, пока существует замыкание, даже после завершения внешнего вызова.

local function counter()
  local n = 0
  return function()
    n = n + 1
    return n
  end
end

local next = counter()
print(next())
print(next())
print(next())

Функции в таблицах

Таблицы могут хранить функции так же, как любые другие значения. Именно так Lua создаёт модули и объекты: таблица сопоставляет имена со значениями-функциями.

Можно найти функцию по ключу и вызвать её или даже перебрать таблицу операций.

local ops = {
  add = function(a, b) return a + b end,
  sub = function(a, b) return a - b end
}

print(ops.add(2, 3))
print(ops["sub"](9, 4))

Таблица стратегий

Хранение функций в таблице позволяет выбирать поведение во время выполнения по ключу. Это заменяет длинные цепочки условий на простой и понятный поиск.

Выбор операции по имени делает вызывающий код коротким и упрощает добавление новых ключей.

local dispatch = {
  upper = string.upper,
  lower = string.lower,
  rev = string.reverse
}

local function run(name, s)
  return dispatch[name](s)
end

print(run("upper", "lua"))
print(run("rev", "lua"))

Функции обратного вызова

Функция обратного вызова — это функция, которую Вы передаёте, чтобы её можно было вызвать позже. Стандартная библиотека Lua использует этот шаблон: например, table.sort принимает функцию сравнения.

Функция обратного вызова определяет правило, а библиотека занимается циклом и перестановкой элементов.

local nums = {5, 2, 9, 1}
table.sort(nums, function(a, b)
  return a > b
end)

print(table.concat(nums, ", "))

У каждой функции своя идентичность

Каждое значение-функция является отдельным объектом. Два отдельных литерала функции никогда не равны, даже если содержат одинаковый код.

Но одна функция, сохранённая в двух переменных, сравнивается как равная самой себе, поскольку оба имени ссылаются на одно и то же значение.

local f = function() return 1 end
local g = function() return 1 end
local h = f

print(f == g)
print(f == h)

Почему это важно

Работа с функциями как со значениями позволяет один раз написать универсальные инструменты и настраивать их передаваемыми функциями. На этом основаны отображение, фильтрация, частичное применение и композиция.

В оставшейся части курса мы создадим практические шаблоны на основе функций первого класса и замыканий.

Быстрая проверка

Проверьте своё понимание функций первого класса в Lua.

Повторение

Функции в Lua являются значениями первого класса: сохраняйте их в переменных и таблицах, передавайте как аргументы и возвращайте из других функций.

Возврат функции, захватывающей локальные переменные окружающей функции, создаёт замыкание. Эти идеи лежат в основе всех последующих функциональных шаблонов.

Часто задаваемые вопросы

Урок «Функции как значения» бесплатный?

Да — полный текст урока «Функции как значения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Функции как значения»?

Сохраняйте функции и передавайте их. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Функции как значения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Функции как значения
  2. map, filter, reduce
  3. Частичное применение
  4. Композиция функций
← Назад к Lua Academy