Elixir 中的命名函数和匿名函数有什么区别?

use*_*934 4 function elixir

命名函数和匿名函数有什么区别?

hello = &("Hello, #{&1}")匿名函数是怎样的?

Mar*_*lin 5

主要区别在于范围之一。您可以访问函数体中的哪些内容。

Elixir 中的命名函数被分组到模块中,它们的范围仅限于提供给它们的参数。

匿名函数可以在任何地方定义,并且可以访问其周围可见的任何内容。行话是它们是“闭包”,它们“关闭”了周围的范围。

让我们看一个例子:

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
Run Code Online (Sandbox Code Playgroud)

您可以使用& 捕获运算符从命名函数创建匿名函数,并且它可以访问您当前的作用域。这是很常见的,因为许多函数都希望其他函数作为参数。浏览的文档Enum,您会看到大量示例。

你会注意到我anon像这样调用匿名函数:anon.(1, 2),而不是anon(1, 2)。它使您的代码中两种函数之间的区别更加明确。

何塞很好地回答了一个相关的问题