2016-11-20 7 views

答えて

3

名前付き関数をモジュール内で定義する必要があります。無名関数にはその制限はありません。

例では、&("Hello, #{&1}")は無名関数部分です。 キャプチャオペレータ&を使用しているため、この機能はほんの短い方法で、fn (x) -> "Hello, #{x}" endを書き込むだけです。 &1は、functionパラメーターのプレースホルダーです。その匿名関数を変数(この場合はhello)に割り当てることができます。変数を使用して関数にアクセスするには、hello.("Derek")を使用します。 ドットを忘れないでください!

関数はエリクシールの型でもあり、関数はファーストクラスの市民だから、変数に代入して関数が他の関数を返すようにすることができます。

4

主な違いは、スコープの1つです。関数本体には何がありますか。

エリクシールの名前付き関数はモジュールにグループ化され、そのスコープは与えられた引数に制限されます。

匿名関数はどこにでも定義することができ、その周囲に表示されているものにアクセスすることができます。専門用語は、それらが「閉鎖」であり、それらが周囲の範囲を「囲む」ことである。

は例を見てみましょう:

c = 10 

anon = fn(a, b) -> a + b + c end 
anon.(1, 2) # => 13, because c is available in the anonymous function 

# The module below will fail to compile, because c isn't available 
defmodule MyModule do 
    def named(a, b), do: a + b + c 
end 

あなたは&capture operatorで指定された関数から無名関数を作成することができ、そしてそれはあなたの現在のスコープにアクセスできるようになります。多くの関数が他の関数を引数として期待しているので、これは一般的です。 the docs for Enumを参照すると、たくさんの例が表示されます。

anon(1, 2)の代わりにanon.(1, 2)のように匿名のanon関数を呼び出しました。 2つの関数の違いがコード内でより明示的になります。

ホセはrelated questionによく答えました。

+1

これはおそらくヘルプよりも混乱を招く可能性がありますが、名前付き関数と匿名関数の誤解を招きます。実際にはクロージャーと式だけがあります。モジュールはコンパイル時に複雑な式を定義する方法であり、クロージャは実行時に複雑な式を定義する方法です。 –

+0

この説明は、私にとって最も意味のあるものであり、実際に私にとっては2つの違いがあります。しかし、匿名関数に取り込まれた名前付き関数が "あなたの現在のスコープにアクセスできるようになる"というあなたのコメントは、私が得意でない部分です。匿名関数に取り込まれた名前付き関数は、それがまだ定義されているスコープにアクセスできるということですか?モジュール内で定義されていた)? – wmock

1

機能自体に名前がない、それが変数にバインドされていますが、インラインどこにでも置くことができる機能が期待されているように:

Enum.map([1,2,3], &("Hello, #{&1}")) 

ません名前。匿名

関連する問題