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. É para isso que serve table.unpack: ele retorna todos os elementos de um array, distribuídos.

local scores: {number} = {85, 92, 78}
print(table.unpack(scores))     -- 85  92  78  (one line, three values)
print(math.max(table.unpack(scores))) -- 92 — cada elemento se tornou um argumento

O equivalente oposto são os varargs: uma função que aceita qualquer número de argumentos por meio de .... Você já viu ... em Lua: o Luau permite tipá-lo, então todo valor recebido deve 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: usado como um único valor em uma expressão, isso equivale efetivamente ao “i-ésimo argumento”.

Os dois recursos se combinam: sum(table.unpack(scores)) distribui o array diretamente na função varargue: a resposta do Luau ao padrão de chamada com spread encontrado em outras linguagens. 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 todas as pontuações em uma única linha usando table.unpack.
  2. Imprima a pontuação mais alta usando math.max e table.unpack.
  3. Defina local function sum(...: number): number que soma todos os seus argumentos usando select("#", ...) e select(i, ...); em seguida, imprima sum(table.unpack(scores)).
  4. Imprima sum(10, 20) para mostrar que a mesma função funciona com argumentos comuns.

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