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