Las funciones anónimas se usan mucho en Elixir por sí solas, como valores devueltos y como argumentos en funciones de orden superior como Enum.map/2:
Enum.map([1, 2, 3], fn n -> n + 1 end)
# => [2, 3, 4]
En Elixir, las funciones se tratan como ciudadanos de primera clase:
Las funciones anónimas se crean con la palabra clave fn y se invocan con un punto (.):
function_variable = fn n -> n + 1 end
function_variable.(1)
# => 2
Las funciones anónimas también se pueden crear con la forma abreviada de captura &.
El & inicial declara el comienzo de la expresión de captura.
&1, &2, etcétera, hacen referencia a los argumentos posicionales de la función anónima.
# Instead of:
fn x, y -> abs(x) + abs(y) end
# We can write:
&(abs(&1) + abs(&2))
El operador de captura & también se puede usar para capturar una función con nombre existente:
# Instead of:
fn a, b -> a <= b end
# We can capture the function using its name and arity:
&<=/2
Las funciones anónimas en Elixir son closures. Pueden acceder a las variables que están en el scope cuando se define la función. Las variables asignadas dentro de una función anónima no son accesibles desde fuera de ella:
y = 2
square = fn ->
x = 3
x * y
end
square.()
# => 6
x
# => ** (CompileError): undefined function x/0