Menu
Coddy logo textTech

Funções Variádicas

Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 27 de 73.

Você usou o ... (varargs) do Lua para escrever funções que aceitam qualquer número de argumentos. O Luau permite que você tipar os varargs, para que cada argumento fornecido seja verificado:

function sum(...: number): number
    local total = 0
    for _, n in ipairs({...}) do
        total = total + n
    end
    return total
end

print(sum(1, 2))           -- 3
print(sum(1, 2, 3, 4, 5))  -- 15

...: number declara que todo argumento extra deve ser um number — sum(1, "two") se torna um erro de tipo. As ferramentas em tempo de execução são as que você já conhece:

  • {...} coleta os varargs em um array (aqui um {number})
  • select("#", ...) conta quantos argumentos chegaram
  • ... pode ser passado diretamente para outra função, por exemplo, math.max(...)

Como no Lua, ... deve ser o último parâmetro — parâmetros normais (tipados) vêm primeiro, o tail variádico coleta o restante:

function joinWords(separator: string, ...: string): string
    return table.concat({...}, separator)
end

print(joinWords("-", "a", "b", "c"))  -- a-b-c
challenge icon

Desafio

Fácil

Crie uma função chamada sumAll que aceite qualquer quantidade de argumentos do tipo number (...: number) e retorne a soma deles como um number.

Crie uma função chamada countValues que aceite qualquer quantidade de argumentos do tipo string e retorne quantos foram passados, como um number — use select("#", ...).

Crie uma função chamada joinWords que aceite um parâmetro obrigatório separator: string seguido por qualquer quantidade de argumentos do tipo string, e os retorne unidos pelo separador (use table.concat em {...}) — tipo de retorno string.

Chame e imprima, cada um em sua própria linha:

  1. sumAll(5, 10, 15)
  2. sumAll(1, 2, 3, 4, 5)
  3. countValues("a", "b", "c", "d")
  4. joinWords("-", "apple", "banana", "cherry")
  5. joinWords(" | ", "red", "green", "blue")

Experimente você mesmo

-- Escreva o código aqui
-- sumAll(...: number): number       -- percorra {...}
-- countValues(...: string): number  -- select("#", ...)
-- joinWords(separator: string, ...: string): string
-- então imprima os cinco resultados
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