Вариативные функции (...)
Часть раздела 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().
Задание
ЛегкоНапишите функцию 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)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов3Продвинутые концепции функций
Возврат нескольких значенийВариативные функции (...)Функции как объекты первого классаАнонимные функцииЧто такое замыкание?Итоги — простой обработчик событий