Elixir匹配疑问:为何{x, ^x}匹配{2,1}未触发Match Error?
为什么Elixir中
{x, ^x} = {2, 1}匹配成功而不触发Match Error? 首先明确Elixir模式匹配的两个核心规则:
- 不带
^的变量是绑定模式:会将右侧对应位置的值绑定给变量(如果变量已有值,会直接覆盖)。 - 带
^的变量是匹配模式:只会用变量当前已有的值去和右侧对应位置的值做匹配,不会重新绑定变量。
回到你的代码示例:
- 第一步
x = 1:变量x被绑定为1。 - 第二步
{x, ^x} = {2, 1}:- 匹配操作启动时,
^x使用的是匹配开始前x的已有值1,去比对右侧元组的第二个元素1,这部分匹配成功。 - 左侧第一个元素的x是绑定模式,将右侧元组的第一个元素2绑定给x,此时x的值被更新为2。
- 元组的所有位置都匹配通过,所以不会触发Match Error,最终返回匹配的右侧元组
{2, 1}。
- 匹配操作启动时,
核心逻辑是:^x的匹配依据是匹配操作发生前变量的旧值,而非本次匹配中变量新绑定的值,所以这次匹配完全合法。
内容的提问来源于stack exchange,提问作者dinesh_pandikona
相关产品推荐
相关产品推荐

