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