【问题标题】:How does the '&' operator work?'&' 运算符是如何工作的?
【发布时间】:2016-10-25 05:46:38
【问题描述】:

我无法理解以下上下文中的“&”运算符。

  @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 怎么可能,我将不胜感激。

【问题讨论】:

  • 相当于fn x -> MapSet.put(x, item) end。我确定在 StackOverflow 上有一个关于此的现有问题,但我似乎找不到它。
  • 我的问题是在这种情况下 x 是什么。
  • 这能回答你的问题吗? Why are there two kinds of functions in Elixir?

标签: elixir


【解决方案1】:

&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)

【讨论】:

  • 我认为这比接受的答案要清楚得多,非常感谢!
【解决方案2】:

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

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 是代理的旧状态

【讨论】:

  • 所以对于地图来说,它对我来说更有意义,我知道它将循环遍历 1 然后 2 等等。但上面我们正在处理put。 @Dogbert 说代码可以表示为fn x -> MapSet.put(x, item) end,我一开始并不感到困惑;相反,在这种情况下,我对x 是什么感到困惑,如果x 是 MapSet 对象,它如何通过&1 获取此引用。我应该在这个问题上更清楚。
【解决方案3】:

如果有人能帮助我理解到底发生了什么,&1 指的是什么,如果它指的是 MapSet,这怎么可能。

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

要使此代码正常运行,必须使用 name: __MODULE__ 调用 Agent.startAgent.start_link 以及返回 {:ok, map_set} 的函数,其中 map_set 是代码中某处的任何 MapSet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2011-01-05
    • 2018-08-31
    • 2013-08-16
    • 2010-10-02
    • 2011-02-19
    • 2015-09-03
    相关资源
    最近更新 更多