匿名函式在 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