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

时间:2017-11-04 11:14:18

标签: elixir

在Elixir中," ="运算符是"绑定"运营商。 所以我想知道为什么这段代码有效:

a = 0
a = a + 1

如果我们检查" a"的值现在是1。 我本来希望看到一个绑定错误消息:

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

如何重新绑定操作?

1 个答案:

答案 0 :(得分:6)

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

要在此处MatchError接收,您需要应用^(pin)运算符,该运算符执行标签exact valuea的模式匹配。

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的great article

TL; DR:Erlang不允许进行重新绑定,Elixir也是如此。更重要的是 - Elixir的模式匹配需要使用^运算符进行显式匹配,否则您将进行重新绑定。

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