Elixir(绑定运算符)中重新分配变量时出现意外行为
在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的先前值”,这与任何其他语言中
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中重新分配变量的情况并不多。