table.unpack e Varargs
Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 20 de 73.
Às vezes você tem valores em um array, mas precisa deles como valores separados — por exemplo, para passar cada elemento como seu próprio argumento. É aí que entra o table.unpack: ele retorna todos os elementos de um array, desempacotados.
local scores: {number} = {85, 92, 78}
print(table.unpack(scores)) -- 85 92 78 (uma linha, três valores)
print(math.max(table.unpack(scores))) -- 92 — cada elemento se tornou um argumentoA imagem espelhada são os varargs: uma função que aceita qualquer quantidade de argumentos via .... Você já viu ... em Lua — Luau permite tipá-lo, para que todo valor recebido deva corresponder ao tipo:
local function sum(...: number): number
local total = 0
for i = 1, select("#", ...) do
total += select(i, ...)
end
return total
endselect("#", ...) retorna quantos argumentos chegaram, e select(i, ...) retorna os argumentos a partir da posição i em diante — usado como um único valor em uma expressão, isso é efetivamente "o i-ésimo argumento".
Os dois recursos se encaixam: sum(table.unpack(scores)) espalha o array diretamente dentro da função vararg — a resposta do Luau ao padrão de chamada spread que você veria em outras linguagens. O table.unpack lê o array sem modificá-lo.
Desafio
FácilCrie um array tipado scores: {number} com 85, 92 e 78.
- Imprima todos os scores em uma única linha usando
table.unpack. - Imprima o maior score usando
math.maxetable.unpack. - Defina
local function sum(...: number): numberque soma todos os seus argumentos usandoselect("#", ...)eselect(i, ...), depois imprimasum(table.unpack(scores)). - Imprima
sum(10, 20)para mostrar que a mesma função funciona com argumentos simples.
Experimente você mesmo
-- Escreva o código aqui
-- 1) declare scores: {number} = {85, 92, 78}
-- 2) print(table.unpack(scores)) e o math.max dos scores desempacotados
-- 3) defina sum(...: number): number com select, print sum(table.unpack(scores))
-- 4) print sum(10, 20)
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Introdução ao Luau
1Começando com o Luau
O que é Luau?Por que usar Luau?Seu primeiro código em LuauVerificação de tipos e modos de erroRecapitulando: Introdução ao Luau4Trabalhando com Funções
Tipando Parâmetros e Valores de RetornoTipando Funções AnônimasFunções que Não Retornam NadaParâmetros OpcionaisValores Padrão para ParâmetrosFunções VariádicasDefinindo Tipos de FunçõesRecapitulação: Funções Tipadas2Tipos Fundamentais
Tipos Básicos: num, str, boolO Tipo 'any': Escape HatchO Tipo 'unknown'Tipos Nil e OpcionaisInferência de Tipos na PráticaAnotações Explícitas de TiposReciclagem: Prática de Tipos Fundamentais5Aliases, Uniões, Interseções
Aliases de Tipos para PrimitivosTipos de UniãoTrabalhando com Tipos de UniãoTipos LiteraisTipos de InterseçãoCombinando Aliases de TiposRecapitulando: Combinações Avançadas de Tipos3Tabelas Tipadas: Arrays e Maps
Arrays TipadosAdicionando e Lendo ElementosO que é um Tipo Map?Declarando e Acessando MapsIterando Sobre TabelasTabelas de Formato MistoArrays Tipados Multidimensionaistable.unpack e VarargsRecapitulando: Arrays e Maps