【问题标题】:What is the equal sign within a function parameter in Elixir?Elixir 中函数参数中的等号是什么?
【发布时间】:2017-06-16 23:10:30
【问题描述】:

我已经像这样定义了一个Foo 模块:

defmodule Foo do
  def hello(x = %{name: name}) do
    IO.inspect [x, name]
  end
end

如果我运行Foo.hello(%{name: "Alice"}),我会得到以下结果:

[%{name: "Alice"}, "Alice"]

然后,我了解到我可以重写 Foo 模块,而无需像这样更改其功能:

defmodule Foo do
  def hello(%{name: name} = x) do
    IO.inspect [x, name]
  end
end

为什么会这样?函数参数中的等号是什么?是普通的匹配算子吗?

据我了解,运算符= 将右侧的值与左侧的模式匹配。

[编辑]

在阅读了贾斯汀的回答后,我自己发布了一个答案。但是,我仍然需要帮助。

我想知道= 运算符在函数头中的行为是否有所不同以及原因。

如果有的话,我想找一份官方文档。

【问题讨论】:

  • 我只是为了确保我们与您在In my understanding... 之后所说的内容一致,并让阅读您的问题的任何人都更清楚:使用模式匹配,Elixir 总是试图让左侧与右侧相同。 Elixir 只会更改匹配运算符左侧的变量的值。

标签: elixir


【解决方案1】:

确实还是匹配操作符。

你可以这样做的原因和你可以这样匹配的原因是一样的

iex(1)> 1 = x

** (CompileError) iex:3: undefined function x/0
iex(2)> x = 1
1
iex(3)> 1 = x
1

在您的函数头中,x 在您使用该函数并将参数传递给它时立即具有一个值(与您可以将函数定义为def hello(x) do ... end 的原因相同)。这意味着您可以在匹配运算符的右侧使用它。

【讨论】:

  • 谢谢。但是,在第二个Foo 模块上,为什么给定的参数首先绑定到x?这是因为x 位于运算符= 的右侧吗?我还不确定值绑定到函数参数的整个机制。
  • x 有一个值,只要您将某些东西传递给函数,无论它是在左侧还是右侧。就像我说的,这和你def hello(x) do ... end时没有什么不同。 “顶级”变量被分配给您传递给函数的任何内容。
【解决方案2】:

google了一阵子,在http://learnyousomeerlang.com/syntax-in-functions上找到了解释。

这篇文章引用了一个 Erlang 函数:

valid_time({Date = {Y,M,D}, Time = {H,Min,S}}) ->
  io:format("The Date tuple (~p) says today is: ~p/~p/~p,~n",[Date,Y,M,D]),
  io:format("The time tuple (~p) indicates: ~p:~p:~p.~n", [Time,H,Min,S]);

然后它说:

请注意,可以在函数头中使用 = 运算符,从而允许我们匹配元组内的内容 ({Y,M,D}) 和整个元组 (Date)。

它是关于Erlang的,但似乎Elixir上的机制是一样的。

为了实验,我重写了Foo模块如下:

defmodule Foo do
  def hello(%{name: x} = %{name: y}) do
    IO.inspect [x, y]
  end
end

然后我运行Foo.hello(%{name: "Alice"}),得到了这个:

["Alice", "Alice"]

参数的模式匹配是针对= 运算符两边 两侧的两个模式进行的。

【讨论】:

猜你喜欢
  • 2016-10-27
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2013-10-31
  • 2015-10-23
相关资源
最近更新 更多