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 três, ou 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
endDentro 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: 15A 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().
Desafio
FácilEscreva 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 sua soma 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, para que sua função os receba como .... Você não precisa modificar nem entender esse código em detalhes; apenas concentre-se 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
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 Lógica e Fluxo
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çõesRevisão - Placar de pontuações máximas3Conceitos Avançados de Funções
Retornando Múltiplos ValoresFunções Variádicas (...)Funções como Valores de Primeira ClasseFunções AnônimasO que é um Closure?Recapitulação - Manipulador de Eventos SimplesPratique por conta própria: Compilador de Lua online