Анонимные функции
Часть раздела Логика и управление потоком путешествия по Lua на Coddy. Урок 13 из 54.
Теперь, когда вы понимаете, что функции можно сохранять в переменных и передавать, есть ещё более лаконичный способ их записывать. Вместо того чтобы всегда давать функции имя, вы можете создать её непосредственно там, где она вам нужна. Такие функции называются анонимными.
Анонимная функция — это просто функция без имени. Её определяют с помощью ключевого слова function, за которым сразу следуют её параметры и тело:
function(a, b)
return a + b
endЭто создает значение функции, которое можно сразу использовать. Анонимные функции особенно полезны, когда функции передаются в качестве аргументов другим функциям. Помнишь пример с пользовательской сортировкой из предыдущего раздела? Вот как он выглядит с анонимной функцией:
local players = {
{name = "Alice", score = 150},
{name = "Bob", score = 200},
{name = "Charlie", score = 175}
}
table.sort(players, function(a, b)
return a.score > b.score
end)Вместо определения отдельной именованной функции для сравнения функция создаётся непосредственно как второй аргумент для table.sort(). Это делает код компактнее и позволяет разместить логику сортировки прямо там, где она используется.
Задание
ЛегкоНапишите функцию filterByThreshold, которая принимает numbers и threshold и возвращает новую таблицу, содержащую только числа, которые больше порогового значения.
В редакторе уже есть вспомогательная функция filter(list, keep): она вызывает keep(value) для каждого значения и возвращает новую таблицу со значениями, для которых keep вернула true. Вызовите filter и передайте проверку в виде анонимной функции, записанной непосредственно в вызове, как в уроке передаётся функция в table.sort(). Не сохраняйте проверку в переменной и не давайте ей имя.
Параметры:
numbers(table): Таблица в виде списка, содержащая числовые значенияthreshold(number): Минимальное значение (не включая его) для фильтрации
Возвращает: Таблицу, содержащую только числа, которые больше порогового значения (table)
Попробуйте сами
local function filter(list, keep)
local result = {}
for _, value in ipairs(list) do
if keep(value) then
table.insert(result, value)
end
end
return result
end
function filterByThreshold(numbers, threshold)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов3Продвинутые концепции функций
Возврат нескольких значенийВариативные функции (...)Функции как объекты первого классаАнонимные функцииЧто такое замыкание?Итоги — простой обработчик событийПотренируйтесь самостоятельно: Онлайн-компилятор Lua