Функции с переменным числом аргументов
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 27 из 73.
Вы уже использовали ... (varargs), чтобы писать функции, принимающие любое количество аргументов. Luau позволяет типизировать varargs, поэтому каждый передаваемый аргумент проверяется:
function sum(...: number): number
local total = 0
for _, n in ipairs({...}) do
total = total + n
end
return total
end
print(sum(1, 2)) -- 3
print(sum(1, 2, 3, 4, 5)) -- 15...: number объявляет, что каждый дополнительный аргумент должен быть числом: sum(1, "two") становится ошибкой типов. Инструменты времени выполнения вам уже знакомы:
{...}собирает varargs в массив (здесь — в{number})select("#", ...)подсчитывает, сколько аргументов было передано...можно напрямую передать другой функции, напримерmath.max(...)
Как и в Lua, ... должен быть последним параметром: обычные (типизированные) параметры идут первыми, а вариативный хвост собирает остальные:
function joinWords(separator: string, ...: string): string
return table.concat({...}, separator)
end
print(joinWords("-", "a", "b", "c")) -- a-b-cЗадание
ЛегкоСоздай функцию с именем sumAll, которая принимает любое количество аргументов number (...: number) и возвращает их сумму как number.
Создай функцию с именем countValues, которая принимает любое количество аргументов string и возвращает количество переданных аргументов как number: используй select("#", ...).
Создай функцию с именем joinWords, которая принимает обязательный separator: string, за которым следует любое количество аргументов string, и возвращает их, объединёнными с помощью разделителя (используй table.concat для {...}): тип возвращаемого значения — string.
Вызови и выведи каждый из них в отдельной строке:
sumAll(5, 10, 15)sumAll(1, 2, 3, 4, 5)countValues("a", "b", "c", "d")joinWords("-", "apple", "banana", "cherry")joinWords(" | ", "red", "green", "blue")
Попробуйте сами
-- Напишите код здесь
-- sumAll(...: number): number -- цикл по {...}
-- countValues(...: string): number -- select("#", ...)
-- joinWords(separator: string, ...: string): string
-- затем выведите пять результатов
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словариПотренируйтесь самостоятельно: Онлайн-компилятор Lua