为什么有些变量会自动绑定到 Elixir 中的其他值?前任。案子

Why do some variables automatically bind to other values in Elixir? Ex. case

我正在学习 Elixir,我很好奇为什么会出现以下情况:

iex(4)> case {:one, :two} do
...(4)>   {:four, :five} ->
...(4)>     "This won't match"
...(4)>   {:one, x} ->
...(4)>     "This will match and bind `x` to `:two`"
...(4)>   _ ->
...(4)>     "This will match any value"
...(4)> end
"This will match and bind `x` to `:two`"

那么如果在这个 'Pattern Matching' 示例中,为什么空变量 x 会自动绑定到原子 :two 并提供正匹配?当这个 case 是第一个 运行.

时,x 不等于 :two

我只是不明白到底发生了什么。

谢谢。

x doesn't equal :two when this case is first run.

没错。 x 是一个未绑定变量,因此它可以匹配任何内容(然后将绑定到它匹配的内容)。在这种情况下,{:one, x} 成功匹配 {:one, :two}(因为 x 可以匹配任何东西),并且由于 x 未绑定,它现在可以绑定到 :two

子句(case 或 function)中的模式匹配执行与 {:one, x} = {:one, :two} 相同的操作(也是模式匹配)。在第二种情况下,很明显您想要测试这两个表达式是否匹配,并且您想要绑定变量 x(如果它之前未绑定)。唯一的区别是,如果匹配在一个子句中失败(例如 {:four, :five} = {:one, :two}),如果前面的子句抛出异常,它将尝试下一个子句。

这是一个非常强大的功能,因为它用很少的几行就完成了很多操作,并且使代码易于阅读。