Menu
Coddy logo textTech

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

Часть раздела Логика и управление потоком путешествия по Lua на Coddy. Урок 11 из 54.

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

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

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.

Логика:

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

Параметры:

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

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

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

-- Не трогайте этот код --
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Проверьте себя

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

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

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