命名和匿名函数有什么区别?
hello = &("Hello, #{&1}")
如何成为匿名函数?
答案 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}") )
没有名字。匿名。