Функции с переменным числом аргументов
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 27 из 73.
Вы уже использовали ... (varargs) в Lua для написания функций, принимающих любое количество аргументов. 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-словари