答えて
名前付き関数をモジュール内で定義する必要があります。無名関数にはその制限はありません。
例では、&("Hello, #{&1}")
は無名関数部分です。 キャプチャオペレータ&
を使用しているため、この機能はほんの短い方法で、fn (x) -> "Hello, #{x}" end
を書き込むだけです。 &1
は、functionパラメーターのプレースホルダーです。その匿名関数を変数(この場合はhello
)に割り当てることができます。変数を使用して関数にアクセスするには、hello.("Derek")
を使用します。 ドットを忘れないでください!
関数はエリクシールの型でもあり、関数はファーストクラスの市民だから、変数に代入して関数が他の関数を返すようにすることができます。
主な違いは、スコープの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によく答えました。
機能自体に名前がない、それが変数にバインドされていますが、インラインどこにでも置くことができる機能が期待されているように:
Enum.map([1,2,3], &("Hello, #{&1}"))
ません名前。匿名
- 1. mutate_atと名前付き匿名関数
- 2. Elixirの名前付き匿名関数
- 3. Selenium JavaScript:匿名関数と名前付き関数
- 4. PHPで使用する匿名関数と匿名関数の違いは何ですか?
- 5. 名前のイベントハンドラと匿名の関数
- 6. Sonarqube(匿名関数VSという名前の関数)
- 7. オブジェクトメソッド関数:匿名または名前付き?
- 8. 関数式で匿名関数に名前を付けますか?
- 9. なぜ匿名関数は名前付き関数と異なる扱いですか?
- 10. 匿名と非匿名の関数Lua
- 11. Jqueryコールバックとして使用すると、匿名関数と名前付き関数のメモリオーバーヘッド
- 12. は匿名関数
- 13. 匿名関数は
- 14. 匿名ネームスペースから名前付きネームスペース内の関数を呼び出す
- 15. 匿名関数の中で名前付き関数変数を更新するエリクシル
- 16. 匿名と名前の付いた関数を参照するプロパティ
- 17. エリクサーで匿名関数を使用する場合
- 18. 名前付き関数をjavascriptで匿名で置き換える
- 19. Selectでの匿名関数
- 20. jQuery名前付き関数と匿名関数を使用してjsonデータを取得する
- 21. 匿名コールバック関数
- 22. (匿名関数)AJAX
- 23. カレー匿名関数
- 24. TypeScript匿名関数
- 25. PHPDocとメソッド匿名関数
- 26. インラインイベントハンドラと匿名関数
- 27. jQueryの匿名関数 - ネスト関数
- 28. PHP:匿名関数と引数は
- 29. Yii2 $ defaultValueは匿名関数
- 30. Rubyコードブロックとjavascriptの匿名関数の違い
これはおそらくヘルプよりも混乱を招く可能性がありますが、名前付き関数と匿名関数の誤解を招きます。実際にはクロージャーと式だけがあります。モジュールはコンパイル時に複雑な式を定義する方法であり、クロージャは実行時に複雑な式を定義する方法です。 –
この説明は、私にとって最も意味のあるものであり、実際に私にとっては2つの違いがあります。しかし、匿名関数に取り込まれた名前付き関数が "あなたの現在のスコープにアクセスできるようになる"というあなたのコメントは、私が得意でない部分です。匿名関数に取り込まれた名前付き関数は、それがまだ定義されているスコープにアクセスできるということですか?モジュール内で定義されていた)? – wmock