Menu
CoddyTech

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

Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 29 из 80.

Ты использовал ... (аргументы переменной длины) в Lua, чтобы писать функции, принимающие любое количество аргументов. В Luau можно указать тип аргументов переменной длины, чтобы проверялся тип каждого переданного аргумента:

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") приведёт к ошибке типа. Для работы во время выполнения используются знакомые тебе инструменты:

  • {...} собирает аргументы переменной длины в массив (здесь это {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

Задание

Легко

Напиши две функции, принимающие любое количество аргументов.

  1. Напиши local function sumAll(...: number): number, которая суммирует {...} с помощью ipairs.
  2. Напиши local function joinWords(separator: string, ...: string): string, которая возвращает table.concat({...}, separator).
  3. Выведи sumAll(5, 10, 15) и joinWords("-", "apple", "banana", "cherry").

Нажми Запустить код: в выводе будут 30 и apple-banana-cherry.

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

-- 1) sumAll(...: number): number
-- 2) joinWords(separator: string, ...: string): string
-- 3) выведите оба результата

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

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