無名

無名関数 の Elixir

4個の演習

無名関数について

無名関数は、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
GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

無名関数を学習する

練習はロックされています

無名関数を練習するには、あと1個の演習のロックを解除してください