Funções Anônimas
Parte da seção Lógica e Fluxo do Journey de Lua da Coddy. Lição 13 de 54.
Agora que você entende que as funções podem ser armazenadas em variáveis e passadas adiante, existe uma maneira ainda mais concisa de escrevê-las. Em vez de sempre dar um nome a uma função, você pode criá-la diretamente onde precisar. Elas são chamadas de funções anônimas.
Uma função anônima é simplesmente uma função sem nome. Você a define usando a palavra-chave function, seguida imediatamente por seus parâmetros e corpo:
function(a, b)
return a + b
endIsso cria um valor de função que pode ser usado imediatamente. Funções anônimas são particularmente úteis ao passar funções como argumentos para outras funções. Lembra do exemplo de ordenação personalizada de antes? Veja como fica com uma função anônima:
local players = {
{name = "Alice", score = 150},
{name = "Bob", score = 200},
{name = "Charlie", score = 175}
}
table.sort(players, function(a, b)
return a.score > b.score
end)Em vez de definir uma função nomeada separada para a comparação, a função é criada diretamente como o segundo argumento de table.sort(). Isso torna o código mais compacto e mantém a lógica de ordenação exatamente onde ela é usada.
Desafio
FácilEscreva uma função filterByThreshold que recebe numbers e threshold e retorna uma nova tabela contendo apenas os números maiores que o limite.
O editor já tem uma função auxiliar, filter(list, keep): ela chama keep(value) para cada valor e retorna uma nova tabela com os valores para os quais keep retornou true. Chame filter e passe a verificação como uma função anônima escrita diretamente na chamada, como na lição, que passa uma para table.sort(). Não armazene a verificação em uma variável nem dê um nome a ela.
Parâmetros:
numbers(tabela): Uma tabela no formato de lista contendo valores numéricosthreshold(número): O valor mínimo (exclusivo) para a filtragem
Retorna: Uma tabela contendo apenas os números maiores que o limite (tabela)
Experimente você mesmo
local function filter(list, keep)
local result = {}
for _, value in ipairs(list) do
if keep(value) then
table.insert(result, value)
end
end
return result
end
function filterByThreshold(numbers, threshold)
-- Escreva o código aqui
end
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