为什么有些变量会自动绑定到 Elixir 中的其他值?前任。案子
Why do some variables automatically bind to other values in Elixir? Ex. case
我正在学习 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`"
那么如果在这个 'Pattern Matching' 示例中,为什么空变量 x
会自动绑定到原子 :two
并提供正匹配?当这个 case
是第一个 运行.
时,x
不等于 :two
我只是不明白到底发生了什么。
谢谢。
x
doesn't equal :two
when this case is first run.
没错。 x
是一个未绑定变量,因此它可以匹配任何内容(然后将绑定到它匹配的内容)。在这种情况下,{:one, x}
成功匹配 {:one, :two}
(因为 x
可以匹配任何东西),并且由于 x
未绑定,它现在可以绑定到 :two
。
子句(case 或 function)中的模式匹配执行与 {:one, x} = {:one, :two}
相同的操作(也是模式匹配)。在第二种情况下,很明显您想要测试这两个表达式是否匹配,并且您想要绑定变量 x(如果它之前未绑定)。唯一的区别是,如果匹配在一个子句中失败(例如 {:four, :five} = {:one, :two}
),如果前面的子句抛出异常,它将尝试下一个子句。
这是一个非常强大的功能,因为它用很少的几行就完成了很多操作,并且使代码易于阅读。
我正在学习 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`"
那么如果在这个 'Pattern Matching' 示例中,为什么空变量 x
会自动绑定到原子 :two
并提供正匹配?当这个 case
是第一个 运行.
x
不等于 :two
我只是不明白到底发生了什么。
谢谢。
x
doesn't equal:two
when this case is first run.
没错。 x
是一个未绑定变量,因此它可以匹配任何内容(然后将绑定到它匹配的内容)。在这种情况下,{:one, x}
成功匹配 {:one, :two}
(因为 x
可以匹配任何东西),并且由于 x
未绑定,它现在可以绑定到 :two
。
子句(case 或 function)中的模式匹配执行与 {:one, x} = {:one, :two}
相同的操作(也是模式匹配)。在第二种情况下,很明显您想要测试这两个表达式是否匹配,并且您想要绑定变量 x(如果它之前未绑定)。唯一的区别是,如果匹配在一个子句中失败(例如 {:four, :five} = {:one, :two}
),如果前面的子句抛出异常,它将尝试下一个子句。
这是一个非常强大的功能,因为它用很少的几行就完成了很多操作,并且使代码易于阅读。