Анонимные функции
Часть раздела Логика и управление потоком путешествия по Lua на Coddy. Урок 13 из 54.
Теперь, когда вы понимаете, что функции можно сохранять в переменных и передавать, существует ещё более краткий способ их записывать. Вместо того чтобы всегда давать функции имя, вы можете создать её непосредственно там, где она вам нужна. Такие функции называются анонимными.
Анонимная функция — это просто функция без имени. Вы определяете её с помощью ключевого слова function, за которым сразу следуют её параметры и тело:
function(a, b)
return a + b
endЭто создаёт значение function, которое можно сразу использовать. Анонимные function особенно полезны при передаче function в качестве аргументов другим function. Помните пример пользовательской сортировки из предыдущего материала? Вот как он выглядит с анонимной function:
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 и возвращает новую таблицу, содержащую только числа, превышающие пороговое значение.
Используйте table.insert() вместе с подходом на основе анонимной функции для фильтрации чисел. Создайте логику фильтрации непосредственно в этом месте, не определяя отдельную именованную функцию.
Логика:
- Создайте пустую таблицу result
- Переберите таблицу numbers
- Для каждого числа используйте анонимную функцию, чтобы проверить, превышает ли оно threshold
- Если проверка возвращает true, добавьте число в таблицу result
- Верните отфильтрованную таблицу result
Параметры:
numbers(table): Таблица в виде списка, содержащая числовые значенияthreshold(number): Минимальное значение (не включая его) для фильтрации
Возвращает: Таблицу, содержащую только числа, превышающие threshold (table)
Попробуйте сами
function filterByThreshold(numbers, threshold)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов3Продвинутые концепции функций
Возврат нескольких значенийВариативные функции (...)Функции как объекты первого классаАнонимные функцииЧто такое замыкание?Итоги — простой обработчик событийПотренируйтесь самостоятельно: Онлайн-компилятор Lua