为什么有些变量会自动绑定到Elixir中的其他值?防爆。案件

时间:2015-02-28 00:13:30

标签: erlang elixir

我正在学习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`"

所以,如果在这个'模式匹配'例如,为什么空变量x会自动绑定到原子:two并提供正匹配?首次运行x时,:two不等于case

我只是没有理解究竟发生了什么。

感谢。

2 个答案:

答案 0 :(得分:6)

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

这是一个非常强大的功能,因为它使用非常少的行进行大量操作,并使代码易于阅读。

答案 1 :(得分:3)

  首次运行此案例时,

x并不等于:two

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