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
endDentro 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: 15A 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().
Desafio
FácilEscreva 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
endDentro 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: 15A 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)
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
1Iteração Avançada de Tabelas
Iterando com pairs()Iterando com ipairs()pairs() vs. ipairs()Revisão - Ficha de Personagem2Mais Funções da Biblioteca Table
table.concat()Construção de tabelas e unpack()table.sort()Ordenação personalizada com funçõesRecapitulação - Placar de recordes3Conceitos Avançados de Funções
Retornando Múltiplos ValoresFunções Variádicas (...)Funções como Valores de Primeira ClasseFunções AnônimasO que é uma Closure?Recapitulação - Manipulador de Eventos Simples