主要区别在于范围之一。您可以访问函数体中的哪些内容。
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)。它使您的代码中两种函数之间的区别更加明确。
何塞很好地回答了一个相关的问题。