Menu
Coddy logo textTech

Вариативные функции (...)

Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 11 из 54.

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

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

function sum(...)
    -- Тело функции
end

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

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- Результат: 30
print(sum(1, 2, 3, 4, 5))  -- Результат: 15

Выражение {...} создаёт таблицу в стиле списка, содержащую все аргументы, переданные в функцию. Затем вы можете перебирать эту таблицу так же, как и любую другую, используя оператор длины # или ipairs().

challenge icon

Задание

Легко

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

Используйте синтаксис вариативных аргументов ..., чтобы принимать гибкое количество аргументов, упакуйте их в таблицу, вычислите их сумму и разделите на их количество.

Примечание: Начальный код (помеченный "Don't touch this code") считывает числа из ввода, преобразует каждое из них из текста в число с помощью tonumber() и сохраняет их в таблицу с именем numbers. В конце он вызывает вашу функцию, используя unpack(numbers), что разворачивает значения таблицы в отдельные аргументы — таким образом, ваша функция получает их как .... Вам не нужно изменять или детально понимать этот код; просто сосредоточьтесь на написании calculateAverage.

Логика:

  • Упакуйте все аргументы в таблицу, используя {...}
  • Переберите таблицу, чтобы вычислить сумму всех чисел
  • Разделите сумму на количество аргументов, чтобы получить среднее значение
  • Верните среднее значение как число

Параметры:

  • ... (числа): Переменное количество числовых аргументов

Возвращает: Среднее значение всех предоставленных чисел (число)

Шпаргалка

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

function sum(...)
    -- Тело функции
end

Внутри функции с переменным числом аргументов упакуйте аргументы в таблицу с помощью {...}:

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- Вывод: 30
print(sum(1, 2, 3, 4, 5))  -- Вывод: 15

Выражение {...} создает таблицу, содержащую все аргументы. Вы можете перебирать её, используя оператор длины # или ipairs().

Попробуйте сами

-- Не трогайте этот код --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- Напишите код здесь
end

local average = calculateAverage(unpack(numbers))
print("Average: " .. average)

quiz iconПроверьте себя

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

Все уроки раздела Logic & Flow