Menu
Coddy logo textTech

Funções Variádicas (...)

Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 11 de 54.

Às vezes, você precisa de uma função que possa trabalhar com qualquer número de argumentos. Talvez você queira calcular a soma de dois números, ou três, ou dez — sem escrever funções separadas para cada caso. Lua fornece uma sintaxe especial para isso: os três pontos ...

Quando você coloca ... na lista de parâmetros de uma função, ela se torna uma função variádica que aceita qualquer número de argumentos:

function sum(...)
    -- Corpo da função
end

Dentro da função, você pode acessar esses argumentos usando ... novamente. Para trabalhar com eles mais facilmente, você pode empacotá-los em uma tabela usando chaves:

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- Saída: 30
print(sum(1, 2, 3, 4, 5))  -- Saída: 15

A expressão {...} cria uma tabela no estilo lista contendo todos os argumentos passados para a função. Você pode então iterar por esta tabela como qualquer outra, usando o operador de comprimento # ou ipairs().

challenge icon

Desafio

Fácil

Escreva uma função calculateAverage que aceite qualquer número de argumentos numéricos e retorne a média deles.

Use a sintaxe variádica ... para aceitar um número flexível de argumentos, empacote-os em uma tabela, calcule a soma deles e divida pela contagem.

Nota: O código inicial (marcado como "Don't touch this code") lê números da entrada, converte cada um de texto para número usando tonumber() e os armazena em uma tabela chamada numbers. Ao final, ele chama sua função usando unpack(numbers), que espalha os valores da tabela como argumentos individuais — assim, sua função os recebe como .... Você não precisa modificar ou entender este código em detalhes; apenas foque em escrever a função calculateAverage.

Lógica:

  • Empacote todos os argumentos em uma tabela usando {...}
  • Itere pela tabela para calcular a soma de todos os números
  • Divida a soma pelo número de argumentos para obter a média
  • Retorne a média como um número

Parâmetros:

  • ... (numbers): Número variável de argumentos numéricos

Retorno: A média de todos os números fornecidos (number)

Folha de consulta

Lua suporta funções variádicas que podem aceitar qualquer número de argumentos usando a sintaxe de três pontos ...:

function sum(...)
    -- Corpo da função
end

Dentro de uma função variádica, empacote os argumentos em uma tabela usando {...}:

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- Saída: 30
print(sum(1, 2, 3, 4, 5))  -- Saída: 15

A expressão {...} cria uma tabela contendo todos os argumentos. Você pode iterar por ela usando o operador de comprimento # ou ipairs().

Experimente você mesmo

-- Não toque neste código --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- Escreva o código aqui
end

local average = calculateAverage(unpack(numbers))
print("Average: " .. average)

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 Logic & Flow