Menu
Coddy logo textTech

Функции с переменным числом аргументов

Часть раздела Введение в 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
challenge icon

Задание

Легко

Создайте функцию с именем sumAll, которая принимает любое количество аргументов типа number (...: number) и возвращает их сумму в виде number.

Создайте функцию с именем countValues, которая принимает любое количество аргументов типа string и возвращает количество переданных аргументов в виде number — используйте select("#", ...).

Создайте функцию с именем joinWords, которая принимает обязательный параметр separator: string, за которым следует любое количество аргументов типа string, и возвращает их соединенными через разделитель (используйте table.concat для {...}) — тип возвращаемого значения string.

Вызовите и выведите на экран, каждый с новой строки:

  1. sumAll(5, 10, 15)
  2. sumAll(1, 2, 3, 4, 5)
  3. countValues("a", "b", "c", "d")
  4. joinWords("-", "apple", "banana", "cherry")
  5. joinWords(" | ", "red", "green", "blue")

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

-- Напишите код здесь
-- sumAll(...: number): number       -- цикл по {...}
-- countValues(...: string): number  -- select("#", ...)
-- joinWords(separator: string, ...: string): string
-- затем выведите пять результатов
quiz iconПроверьте себя

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

Все уроки раздела Введение в Luau