Erlang 为什么有些变量会自动绑定到Elixir中的其他值?例

Erlang 为什么有些变量会自动绑定到Elixir中的其他值?例,erlang,elixir,Erlang,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)> "T

我正在学习长生不老药,我很好奇为什么会发生以下情况:

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
会自动绑定到atom
:two并提供正匹配
x
不等于
:首次运行此
案例时,两个

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

谢谢

x
不等于
:首次运行此案例时的两个

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

x
不等于
:首次运行此案例时的两个


没错
x
是一个未绑定的变量,因此它可以匹配任何内容(然后将绑定到它匹配的内容)。在这种情况下,
{:one,x}
成功地匹配了
{:one,:two}
(因为
x
可以匹配任何东西),并且
x
未绑定,现在可以绑定到
:two
子句(大小写或函数)中的模式匹配执行与
{:one,x}={:one,:two}
相同的操作(这也是模式匹配)。在第二种情况下,很明显,您希望测试这两个表达式是否匹配,并且如果变量x以前未绑定,您希望绑定它。唯一的区别是,如果匹配在子句中失败(例如
{:four,:five}={:one,:two}
),如果前一个子句引发异常,它将尝试下一个子句


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

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


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

我想这是有道理的。但我仍然想知道是什么原因导致
x
绑定到
:两个:
?我知道它可以,但为什么有必要这样做呢?
x
可能只是一个空变量t什么不匹配<代码>:两个<代码>,不是吗?@reknirt:你的意思是,为什么一开始就需要将变量绑定到值?我们回顾了这一点,我想请你解释一下为什么一开始就确实需要将变量绑定到值。我想这是有道理的。但我仍然想知道是什么原因导致<代码>x
绑定到
:两个:
?我知道它可以,但为什么有必要这样做?
x
可能只是一个空变量,与
:两个不匹配,不是吗?@reknirt:你的意思是,为什么一开始就有必要将变量绑定到值?我们回顾了这一点,希望你能解释一下A为什么首先确实需要将变量绑定到值。如果要使用当前值x进行模式匹配,请使用pin运算符:^x如果要使用当前值x进行模式匹配,请使用pin运算符:^x