Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir(绑定运算符)中重新分配变量时出现意外行为_Elixir - Fatal编程技术网

Elixir(绑定运算符)中重新分配变量时出现意外行为

Elixir(绑定运算符)中重新分配变量时出现意外行为,elixir,Elixir,在Elixir中,“=”运算符是“绑定”运算符。 所以我想知道为什么这段代码会起作用: a = 0 a = a + 1 如果我们检查“a”的值现在是1。 我希望看到绑定错误消息,如: ** (MatchError) no match of right hand side value: 0 重新绑定操作是如何工作的?在Elixir=中是模式匹配操作符。它检查左侧和右侧是否相等。 但是,它也用于绑定和重新绑定变量。在您的示例中,重新绑定仅仅意味着“现在让a存储a+1的先前值”,这与任何其他语言中

在Elixir中,“=”运算符是“绑定”运算符。 所以我想知道为什么这段代码会起作用:

a = 0
a = a + 1
如果我们检查“a”的值现在是1。 我希望看到绑定错误消息,如:

** (MatchError) no match of right hand side value: 0

重新绑定操作是如何工作的?

在Elixir
=
中是模式匹配操作符。它检查左侧和右侧是否相等。 但是,它也用于绑定和重新绑定变量。在您的示例中,重新绑定仅仅意味着“现在让
a
存储
a
+1的先前值”,这与任何其他语言中的赋值非常相似

要在此处接收
MatchError
,您需要应用
^
(pin)运算符,该运算符对标签
a
下方的
精确值进行模式匹配

iex(1)> a = 0
0
iex(2)> ^a = a
0
iex(3)> ^a = 0
0
iex(4)> ^a = a + 1
** (MatchError) no match of right hand side value: 1
我建议你读一下JoséValim的文章

TL;博士:Erlang不允许重新绑定,Elixir允许。更重要的是,Elixir的模式匹配需要使用
^
操作符进行显式匹配,否则需要重新绑定


绑定它只是指向内存中值所在位置的“指针”,因此垃圾收集器知道在您的示例中0未使用。

在Elixir
=
中是模式匹配运算符。它检查左侧和右侧是否相等。 但是,它也用于绑定和重新绑定变量。在您的示例中,重新绑定仅仅意味着“现在让
a
存储
a
+1的先前值”,这与任何其他语言中的赋值非常相似

要在此处接收
MatchError
,您需要应用
^
(pin)运算符,该运算符对标签
a
下方的
精确值进行模式匹配

iex(1)> a = 0
0
iex(2)> ^a = a
0
iex(3)> ^a = 0
0
iex(4)> ^a = a + 1
** (MatchError) no match of right hand side value: 1
我建议你读一下JoséValim的文章

TL;博士:Erlang不允许重新绑定,Elixir允许。更重要的是,Elixir的模式匹配需要使用
^
操作符进行显式匹配,否则需要重新绑定


绑定它只是指向内存中值所在位置的“指针”,因此垃圾收集器知道在您的示例中0未使用。

这应该是一个常见问题解答。在示例代码中,您没有反弹
a
。您正在默默地创建一个新的
a
。由于缺乏任何研究,投票被否决。嗨,Onorio,我使用iex对此进行了大量研究。问题是不清楚在这种情况下重新绑定是如何工作的,因为表达式a=a+1应该是一个模式匹配。它被反复询问。如果你做过任何研究,你会遇到这个问题,因为这是一个非常常见的问题。对不起,反对票。这应该是一个常见问题。在示例代码中,您没有反弹
a
。您正在默默地创建一个新的
a
。由于缺乏任何研究,投票被否决。嗨,Onorio,我使用iex对此进行了大量研究。问题是不清楚在这种情况下重新绑定是如何工作的,因为表达式a=a+1应该是一个模式匹配。它被反复询问。如果你做过任何研究,你会遇到这个问题,因为这是一个非常常见的问题。对不起,投反对票。嗨@PatNovak谢谢你的回复。在我看来,这种情况下的“重新绑定”会产生更多的混乱,而不是好处:(好吧,这不是我的决定,但它与我们(感觉爱上了Elixir的OOP开发人员)更为相似)在以前的语言中,had。老实说,如果您依赖管道和小函数,那么在Elixir中重新分配变量的情况并不多。Hi@PatNovak感谢您的回答。在我看来,这种情况下的“重新绑定”会产生更多的混乱而不是好处:(好吧,这不是我的决定,但它更类似于我们所做的(热爱Elixir的OOP开发人员)在以前的语言中使用过。老实说,如果您依赖管道和小函数,那么在Elixir中重新分配变量的情况并不多。