Menu
Coddy logo textTech

table.unpack и Varargs

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

Иногда у вас есть значения в массиве, но они нужны вам как отдельные значения — например, чтобы передать каждый элемент как отдельный аргумент. Для этого служит table.unpack: она возвращает все элементы массива в развернутом виде.

local scores: {number} = {85, 92, 78}
print(table.unpack(scores))     -- 85  92  78  (одна строка, три значения)
print(math.max(table.unpack(scores))) -- 92 — каждый элемент стал аргументом

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

local function sum(...: number): number
    local total = 0
    for i = 1, select("#", ...) do
        total += select(i, ...)
    end
    return total
end

select("#", ...) возвращает количество поступивших аргументов, а select(i, ...) возвращает аргументы, начиная с позиции i — при использовании в качестве одиночного значения в выражении это фактически «i-й аргумент».

Эти две возможности отлично работают вместе: sum(table.unpack(scores)) разворачивает массив прямо в vararg-функцию — аналог паттерна spread-вызова из других языков программирования в Luau. table.unpack считывает массив, не изменяя его.

challenge icon

Задание

Легко

Создайте типизированный массив scores: {number} со значениями 85, 92 и 78.

  1. Выведите все значения scores в одну строку с помощью table.unpack.
  2. Выведите наивысший балл, используя math.max и table.unpack.
  3. Определите local function sum(...: number): number, которая суммирует все свои аргументы с помощью select("#", ...) и select(i, ...), затем выведите sum(table.unpack(scores)).
  4. Выведите sum(10, 20), чтобы показать, что эта же функция работает с обычными аргументами.

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

-- Напишите код здесь
-- 1) объявите scores: {number} = {85, 92, 78}
-- 2) print(table.unpack(scores)) и math.max распакованных scores
-- 3) определите sum(...: number): number с select, print sum(table.unpack(scores))
-- 4) print sum(10, 20)
quiz iconПроверьте себя

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

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