無名関数は、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