繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM