[英]What Is The Difference Between A Named And An Anonymous Function In Elixir?
命名和匿名函数有什么区别?
hello = &("Hello, #{&1}")
是一个匿名函数?
主要区别在于范围之一。 你在函数体中有什么访问权限。
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运算符从命名函数创建匿名函数,它可以访问您当前的作用域。 这很常见,因为许多函数都希望其他函数作为参数。 浏览Enum
的文档 ,你会看到很多例子。
你会注意到我称这样的匿名anon
函数: anon.(1, 2)
,而不是anon(1, 2)
。 它使您的代码中两种函数之间的区别更加明显。
何塞对一个相关问题给出了一个很好的答案。
需要在模块内定义命名函数。 匿名函数没有该限制。
在您的示例中, &("Hello, #{&1}")
是匿名函数部分。 它使用捕获运算符 &
,因此这个函数只是编写fn (x) -> "Hello, #{x}" end
一种较短方式。 &1
是函数参数的占位符。 您可以将该匿名函数分配给变量(在本例中为hello
)。 要通过变量访问该函数,请使用hello.("Derek")
。 不要忘记点!
请记住,Function也是Elixir中的一个类型,函数是一等公民,这就是为什么你可以将它分配给一个变量并让函数返回其他函数。
函数本身没有名称,它绑定到一个变量,但你可以将它放在函数预期的任何地方,如:
Enum.map([1,2,3], &("Hello, #{&1}") )
无名。 匿名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.