Elixir中命名和匿名函数之间的区别是什么?

时间:2016-11-20 21:55:19

标签: function elixir

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

hello = &("Hello, #{&1}")如何成为匿名函数?

3 个答案:

答案 0 :(得分:4)

主要区别在于范围之一。您可以在函数体中访问什么。

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

您可以使用& capture operator从命名函数创建匿名函数,它可以访问您当前的范围。这很常见,因为许多函数都希望其他函数作为参数。浏览the docs for Enum,你会看到很多例子。

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

José对related question给出了一个很好的答案。

答案 1 :(得分:3)

需要在模块内定义命名函数。匿名函数没有这个限制。

在您的示例中,&("Hello, #{&1}")是匿名函数部分。它正在使用捕获运算符 &,因此这个函数只是编写fn (x) -> "Hello, #{x}" end的一种较短方式。 &1是函数参数的占位符。您可以将该匿名函数分配给变量(在本例中为hello)。要通过变量访问该函数,请使用hello.("Derek")不要忘记点!

请记住,函数也是Elixir中的一个类型,函数是一等公民,这就是为什么你可以将它分配给变量并使函数返回其他函数。

答案 2 :(得分:1)

函数本身没有名称,它绑定到变量,但您可以将其放在函数预期的任何位置:

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

没有名字。匿名。