在Elixir中," ="运算符是"绑定"运营商。 所以我想知道为什么这段代码有效:
a = 0
a = a + 1
如果我们检查" a"的值现在是1。 我本来希望看到一个绑定错误消息:
** (MatchError) no match of right hand side value: 0
如何重新绑定操作?
答案 0 :(得分:6)
在Elixir =
中是模式匹配运算符。它检查左侧是否等于右侧。
但是,它也用于绑定和重新绑定变量。在您的示例中,重新绑定只是意味着“让a
现在存储以前的a
+ 1”值,这与任何其他语言的赋值完全相似。
要在此处MatchError
接收,您需要应用^
(pin)运算符,该运算符执行标签exact value
下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的great article。
TL; DR:Erlang不允许进行重新绑定,Elixir也是如此。更重要的是 - Elixir的模式匹配需要使用^
运算符进行显式匹配,否则您将进行重新绑定。
绑定它只是一个“指针”指向值在内存中的位置,因此垃圾收集器知道示例中未使用0。