Menu
Coddy logo textTech

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

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

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