在Elixir中,"="运算符是"绑定"运算符.所以我想知道为什么这段代码有效:
a = 0
a = a + 1
Run Code Online (Sandbox Code Playgroud)
如果我们检查"a"的值现在是1.我本来希望看到一个绑定错误消息,如:
** (MatchError) no match of right hand side value: 0
Run Code Online (Sandbox Code Playgroud)
如何重新绑定操作?
在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
Run Code Online (Sandbox Code Playgroud)
我建议你阅读JoséValim关于此的精彩文章.
TL; DR:Erlang不允许重新绑定,Elixir确实如此.更重要的是 - Elixir的模式匹配需要使用^运算符进行显式匹配,否则就会进行重新绑定.
绑定它只是一个"指针"指向内存中值的位置,因此垃圾收集器知道示例中0未使用.