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 MapsPratique por conta própria: Compilador de Lua online