Menu
Coddy logo textTech

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 argumento

A 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
end

select("#", ...) 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.

challenge icon

Desafio

Fácil

Crie um array tipado scores: {number} com 85, 92 e 78.

  1. Imprima todos os scores em uma única linha usando table.unpack.
  2. Imprima o maior score usando math.max e table.unpack.
  3. Defina local function sum(...: number): number que soma todos os seus argumentos usando select("#", ...) e select(i, ...), depois imprima sum(table.unpack(scores)).
  4. 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)
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Lua online