Menu
CoddyTech

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

Часть раздела Логика и управление потоком путешествия по 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(). Это делает код компактнее и позволяет разместить логику сортировки прямо там, где она используется.

challenge icon

Задание

Легко

Напишите функцию 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Lua