匿名函数在 Elixir 中经常单独使用,也用作返回值,或作为高阶函数(如Enum.map/2)的实参:
Enum.map([1, 2, 3], fn n -> n + 1 end)
# => [2, 3, 4]
Elixir 中的函数被视为一等公民:
匿名函数用fn关键字创建,通过点号(.)调用:
function_variable = fn n -> n + 1 end
function_variable.(1)
# => 2
匿名函数也可以用&捕获简写创建。
开头的&表示捕获表达式的开始。
&1、&2等指的是匿名函数的位置实参。
# Instead of:
fn x, y -> abs(x) + abs(y) end
# We can write:
&(abs(&1) + abs(&2))
&捕获运算符也可以用来_捕获_现有的具名函数:
# Instead of:
fn a, b -> a <= b end
# We can capture the function using its name and arity:
&<=/2
Elixir 中的匿名函数是闭包。它们可以访问定义函数时处于作用域内的变量。在匿名函数内部赋值的变量,在函数外部无法访问:
y = 2
square = fn ->
x = 3
x * y
end
square.()
# => 6
x
# => ** (CompileError): undefined function x/0