Функции как объекты первого класса
Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 12 из 54.
В Lua функции — это не просто блоки кода, выполняющие задачи, они являются значениями, с которыми можно обращаться так же, как с любым другим типом данных. Это означает, что вы можете работать с функциями так же, как с числами, строками или таблицами.
Вы можете сохранить функцию в переменной:
local greet = function()
print("Hello!")
end
greet() -- Вывод: Hello!Здесь функция присваивается переменной greet, и вы можете вызывать её так же, как любую обычную функцию. Это открывает мощные возможности для структурирования вашего кода.
Функции также могут передаваться в качестве аргументов другим функциям. Это особенно полезно, когда вы хотите, чтобы одна функция использовала поведение, определенное в другой:
function executeAction(action)
action()
end
local sayHello = function()
print("Hello from a function!")
end
executeAction(sayHello) -- Вывод: Hello from a function!В этом примере executeAction принимает функцию в качестве параметра и вызывает её. Функция sayHello передается точно так же, как вы бы передали число или строку.
Функции могут даже возвращать другие функции. Это позволяет создавать функции динамически на основе определенных условий или параметров:
function createMultiplier(factor)
return function(number)
return number * factor
end
end
local double = createMultiplier(2)
print(double(5)) -- Output: 10Задание
ЛегкоНапишите функцию applyOperation, которая принимает a, b и operation и возвращает результат применения функции операции к двум числам.
Параметр operation — это таблица, содержащая функцию, которая будет вызвана с аргументами a и b.
Логика:
- Извлеките функцию из таблицы
operation, используя ключ"func" - Вызовите эту функцию с аргументами
aиb - Верните результат
Параметры:
a(number): Первое числоb(number): Второе числоoperation(table): Таблица, содержащая функцию, хранящуюся по ключу"func"
Возвращает: Результат вызова функции операции с a и b (number)
Шпаргалка
В Lua функции являются значениями первого класса, которые могут храниться в переменных, передаваться в качестве аргументов и возвращаться из других функций.
Сохранение функции в переменной:
local greet = function()
print("Hello!")
end
greet() -- Вывод: Hello!Передача функции в качестве аргумента:
function executeAction(action)
action()
end
local sayHello = function()
print("Hello from a function!")
end
executeAction(sayHello) -- Вывод: Hello from a function!Возврат функции из другой функции:
function createMultiplier(factor)
return function(number)
return number * factor
end
end
local double = createMultiplier(2)
print(double(5)) -- Вывод: 10Попробуйте сами
function applyOperation(a, b, operation)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов3Продвинутые концепции функций
Возврат нескольких значенийВариативные функции (...)Функции как объекты первого классаАнонимные функцииЧто такое замыкание?Итоги — простой обработчик событий