'&'运算符如何工作?

问题描述 投票:3回答:3

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

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

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

elixir
3个回答
4
投票

如果有人能帮助我理解究竟发生了什么以及&1指的是什么,如果它引用了MapSet,我将不胜感激。

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

要使此代码起作用,必须使用Agent.start调用Agent.start_linkname: __MODULE__,并返回{:ok, map_set}函数,其中map_set是代码中某处的任何MapSet


19
投票

&1是该函数的第一个参数。整个&符号基本上是表达匿名函数的另一种方式 - EnumAgent对此没有任何具体说明。我们来看这个例子:

fn (x, y, z) -> (x + z) * y end

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

&((&1 + &3) * &2)

&1&2&3想象成一个表达式的占位符。所以,当你这样做

Agent.update(__MODULE__, &MapSet.put(&1, item))

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

Agent.update(__MODULE__, fn x -> MapSet.put(x, item) end)

5
投票

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

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

Enum.map [1, 2, 3, 5], fn x -> x * 2 end // Exactly like above

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

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

© www.soinside.com 2019 - 2024. All rights reserved.