Funciones anónimas
Parte de la sección Lógica y flujo de control del Journey de Lua de Coddy. Lección 13 de 54.
Ahora que entiendes que las funciones se pueden almacenar en variables y pasar de un lado a otro, hay una forma aún más concisa de escribirlas. En lugar de darle siempre un nombre a una función, puedes crearla directamente donde la necesites. Estas se llaman funciones anónimas.
Una función anónima es simplemente una función sin nombre. La defines usando la palabra clave function seguida inmediatamente de sus parámetros y su cuerpo:
function(a, b)
return a + b
endEsto crea un valor de función que se puede usar de inmediato. Las funciones anónimas son especialmente útiles al pasar funciones como argumentos a otras funciones. ¿Recuerdas el ejemplo de ordenamiento personalizado de antes? Así se ve con una función 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)En lugar de definir una función con nombre aparte para la comparación, la función se crea directamente como segundo argumento de table.sort(). Esto hace que el código sea más compacto y mantiene la lógica de ordenación justo donde se usa.
Desafío
FácilEscribe una función filterByThreshold que reciba numbers y threshold y devuelva una nueva tabla que contenga solo los números mayores que el umbral.
El editor ya tiene una función auxiliar, filter(list, keep): llama a keep(value) para cada valor y devuelve una nueva tabla con los valores para los que keep devolvió true. Llama a filter y pasa la comprobación como una función anónima escrita directamente en la llamada, como en la lección, donde se pasa una a table.sort(). No guardes la comprobación en una variable ni le asignes un nombre.
Parámetros:
numbers(tabla): Una tabla de estilo lista que contiene valores numéricosthreshold(número): El valor mínimo (exclusivo) para el filtrado
Devuelve: Una tabla que contiene solo números mayores que el umbral (tabla)
Pruébalo tú mismo
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)
-- Escribe el código aquí
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo de control
1Iteración avanzada de tablas
Iterar con pairs()Iterar con ipairs()pairs() vs. ipairs()Resumen - Ficha de personaje2Más funciones de la librería table
table.concat()Construcción de tablas y unpack()table.sort()Ordenamiento personalizado con funcionesRepaso - Tabla de puntuaciones altas3Conceptos avanzados de funciones
Retorno de múltiples valoresFunciones variádicas (...)Funciones como valores de primera claseFunciones anónimas¿Qué es un Closure?Resumen - Manejador de eventos simplePractica por tu cuenta: Compilador de Lua online