Menu
CoddyTech

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

Parte da seção Lógica e fluxo do Journey de Lua da Coddy. Lição 11 de 54.

Às vezes, você precisa de uma função que possa trabalhar com qualquer quantidade de argumentos. Talvez queira calcular a soma de dois números, ou de três, ou de dez, sem escrever funções separadas para cada caso. Lua oferece 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 com mais facilidade, você pode agrupá-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 de lista contendo todos os argumentos passados para a função. Você pode então iterar por essa tabela como faria com qualquer outra, usando o operador de comprimento # ou ipairs().

Isso funciona desde que nenhum argumento seja nil. Um nil deixa uma lacuna na tabela, e # não é confiável em uma tabela com lacunas. select("#", ...) sempre retorna o número de argumentos, incluindo os nil:

function countArgs(...)
    return select("#", ...)
end

print(countArgs(10, 20, 30))        -- Saída: 3
print(countArgs(10, nil, 30, nil))  -- Saída: 4
challenge icon

Desafio

Fácil

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

Use a sintaxe variádica ... para aceitar uma quantidade flexível de argumentos, agrupá-los em uma tabela, calcular a soma deles e dividi-la pela quantidade.

Observação: 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. No final, ele chama sua função usando unpack(numbers), que espalha os valores da tabela como argumentos individuais, então sua função os recebe como .... Você não precisa modificar nem entender esse código em detalhes; concentre-se apenas em escrever calculateAverage.

Lógica:

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

Parâmetros:

  • ... (números): quantidade variável de argumentos numéricos

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

Experimente você mesmo

-- Não mexa 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
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 Lógica e fluxo

Pratique por conta própria: Compilador de Lua online