'&'运算符如何工作?

cog*_*gle 4 elixir

我在以下上下文中无法理解'&'运算符.

  @doc "Marks a task as executed"
  def put_task(task, project) do
    item = {task, project}
    Agent.update(__MODULE__, &MapSet.put(&1, item))
  end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,似乎'&1'指的是地图对象本身,但我很好奇这是如何工作的.它是作为一个参数传递给我自己在文档中查看这个,但无法确定这是否正是发生了什么.如果有人能帮助我理解究竟发生了什么以及&1指的是什么,如果它引用了MapSet,我将不胜感激.

Paw*_*rok 21

&1是函数的第一个参数.整个&表示法基本上是表达匿名函数的另一种方式 - 没有任何特定的EnumAgent与之相关的.我们来看这个例子:

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

这是一个匿名函数,它接受3个参数,添加第一个和第三个参数,并将结果乘以第二个参数.用&符号表示:

&((&1 + &3) * &2)
Run Code Online (Sandbox Code Playgroud)

想想这个&1,&2并且&3作为一个表达式中的占位符,参数将在其中出现.所以,当你这样做

Agent.update(__MODULE__, &MapSet.put(&1, item))
Run Code Online (Sandbox Code Playgroud)

你正在Agent.update使用一个参数函数进行调用MapSet.put,该函数使用该参数和项调用- 无论是什么.它相当于:

Agent.update(__MODULE__, fn x -> MapSet.put(x, item) end)
Run Code Online (Sandbox Code Playgroud)

  • 我认为这比接受的答案要清楚得多,多亏了! (3认同)

cod*_*hal 5

让我们考虑一个更简单的例子,

Enum.map [1, 2, 3, 4], &(&1 * 2)

Enum.map [1, 2, 3, 5], fn x -> x * 2 end // Exactly like above
Run Code Online (Sandbox Code Playgroud)

为了Enum.map我们基本上传递一个列表和一个匿名函数.Enum.map期望匿名函数至少有一个参数(没有脑子,它将列表的每个元素传递给匿名函数).所以这里&1 是匿名函数的第一个参数,它将在Enum.map调用我们的匿名函数时设置.Enum.map循环遍历列表,每次使用列表中的不同元素调用我们的匿名函数.

虽然我不知道它的实现Agent.update,但据我所知它是做什么的,Agent.update是调用代理哪个_MODULE_和这个应用函数Map.Set接收代理的旧状态,并设置新的状态中介.换句话说,你可以说&1是代理的旧状态


Dog*_*ert 5

如果有人可以帮助我了解到底发生了什么和&1所指的内容,以及如果它所指的是MapSet的话,这将是可能的。

Agent.update/3调用具有当前状态的给定函数,并将返回值存储为新状态。由于&MapSet.put(&1, item)与相同fn x -> MapSet.put(x, item) end,因此x这里成为旧状态,而MapSet返回MapSet.put/2的新状态则成为代理的新状态。

为了使此代码起作用,必须调用Agent.startAgent.start_link使用,name: __MODULE__并且必须有一个函数返回代码中任何地方的{:ok, map_set}where 。map_setMapSet