灵丹妙药中的“&1”是什么意思?

Mik*_*ike 7 elixir

给定这个函数,&1指的是什么?

Enum.map [1, 2, 3, 4], &(&1 * 2)
Run Code Online (Sandbox Code Playgroud)

Mik*_*ike 15

&1指回调函数将接收的第一个参数。与号本身 ( &) 是捕获函数的简写。这就是您可以扩展该功能的方式。

Enum.map([1, 2, 3, 4], fn x -> x * 2 end)
Run Code Online (Sandbox Code Playgroud)

fn -> 等于 &(...

x -> x 等于 ...(&1

可以在此处找到快速参考


Har*_*cas 8

&(1 + &1)elixir 中的语法只是编写匿名函数的另一种方式。

因此,鉴于上述:

fn(x) -> 1 + x end
Run Code Online (Sandbox Code Playgroud)

&(1 + &1)
Run Code Online (Sandbox Code Playgroud)

这只是编写匿名函数的另一种方式,通常在您执行小型操作单元或简单地调用另一个函数时使用。

每个&n使用该语法时,指的是在该函数中调用的参数的位置。

所以:

fn(x, y, z) -> x + y + z end
Run Code Online (Sandbox Code Playgroud)

这意味着如果您要使用速记&匿名函数语法:

  • x == &1因为x是第一个参数
  • y == &2因为y是第二个参数
  • z == &3因为z是第三个参数

表示这些参数的另一种方法是使用匿名函数 + arity 语法,它几乎充当委托人。

例如,假设您想映射值列表并为每个值应用一个函数。使用基本的匿名函数语法,它看起来像:

Enum.map([1, 2, 3], fn(x) -> add_one(x) end)
Run Code Online (Sandbox Code Playgroud)

使用&with 参数捕获 ( &1)

Enum.map([1, 2, 3], &(add_one(&1))
Run Code Online (Sandbox Code Playgroud)

使用&with arity 匹配:

Enum.map([1, 2, 3], &add_one/1)
Run Code Online (Sandbox Code Playgroud)

简单地说,这个匿名函数将只接受 1 个参数,并且该参数应该应用于被调用的函数,该函数add_one也是一个 1 元函数。

因此,上面的三个示例完全相同,并且都会导致在add_one每个参数上都被调用。