table.unpack и Varargs
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 20 из 73.
Иногда у тебя есть значения в массиве, но нужны они как separate значения: например, чтобы передать каждый element как отдельный argument. Для этого используется table.unpack: она возвращает все element массива, раскрывая их.
local scores: {number} = {85, 92, 78}
print(table.unpack(scores)) -- 85 92 78 (одна строка, три значения)
print(math.max(table.unpack(scores))) -- 92 — каждый элемент стал аргументомЗеркальная противоположность — varargs: function, принимающая любое количество argument через .... Ты уже видел ... в Lua: Luau позволяет указать его тип, чтобы каждое входящее значение ему соответствовало:
local function sum(...: number): number
local total = 0
for i = 1, select("#", ...) do
total += select(i, ...)
end
return total
endselect("#", ...) возвращает, сколько argument поступило, а select(i, ...) возвращает argument, начиная с позиции i: если использовать его как отдельное значение в выражении, это фактически «i-й argument».
Эти две возможности хорошо сочетаются: sum(table.unpack(scores)) раскрывает массив непосредственно в varargs-function — это вариант Luau для шаблона вызова с раскрытием, который встречается в других языках. table.unpack читает массив, не изменяя его.
Задание
ЛегкоСоздайте типизированный массив scores: {number} со значениями 85, 92 и 78.
- Выведите все scores в одной строке с помощью
table.unpack. - Выведите наибольшее значение scores с помощью
math.maxиtable.unpack. - Определите
local function sum(...: number): number, которая складывает все свои аргументы с помощьюselect("#", ...)иselect(i, ...), затем выведитеsum(table.unpack(scores)). - Выведите
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)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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-словариПотренируйтесь самостоятельно: Онлайн-компилятор Lua