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

Gia*_*cci 0 elixir

在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)

如何重新绑定操作?

Pat*_*wak 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
Run Code Online (Sandbox Code Playgroud)

我建议你阅读JoséValim关于此的精彩文章.

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

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