我正在学习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
。
我只是没有理解究竟发生了什么。
感谢。
答案 0 :(得分:6)
子句中的模式匹配(大小写或函数)执行与{:one, x} = {:one, :two}
相同的操作(也是模式匹配)。在第二种情况下,很明显您要测试2个表达式是否匹配,并且如果先前未绑定,则要绑定变量x。唯一的区别是,如果匹配在子句中失败(例如{:four, :five} = {:one, :two}
),如果任何先前的子句抛出异常,它将尝试下一个子句。
这是一个非常强大的功能,因为它使用非常少的行进行大量操作,并使代码易于阅读。
答案 1 :(得分:3)
首次运行此案例时,
x
并不等于:two
。
完全。 x
是一个未绑定的变量,因此它可以匹配任何内容(然后将绑定到它匹配的内容)。在这种情况下,{:one, x}
成功匹配{:one, :two}
(因为x
可以匹配任何内容),并且由于x
未绑定,现在可以绑定到:two
。