Elixir - 模式匹配



模式匹配是 Elixir 从 Erlang 继承的一项技术。它是一种非常强大的技术,允许我们从复杂的结构(如列表、元组、映射等)中提取更简单的子结构。

匹配有两个主要部分,左边右边。右边是任何类型的结构。左边尝试匹配右边的结构,并将左边任何变量绑定到右边的相应子结构。如果找不到匹配项,运算符将引发错误。

最简单的匹配是左边是一个单独的变量,右边是任何结构。此变量将匹配任何内容。例如,

x = 12
x = "Hello"
IO.puts(x)

您可以在结构中放置变量,以便捕获子结构。例如,

[var_1, _unused_var, var_2] = [{"First variable"}, 25, "Second variable" ]
IO.puts(var_1)
IO.puts(var_2)

这将把值{"First variable"}存储在var_1中,并将"Second variable"存储在var_2中。还有一个特殊的_变量(或以'_'为前缀的变量),它的作用与其他变量完全相同,但它告诉 elixir,“确保这里有一些东西,但我并不关心它到底是什么。”。在前面的示例中,_unused_var 就是这样的一个变量。

我们可以使用此技术匹配更复杂的模式。例如,如果您想解包并在一个元组中获取一个数字,该元组在一个列表中,该列表本身又在一个列表中,您可以使用以下命令:

[_, [_, {a}]] = ["Random string", [:an_atom, {24}]]
IO.puts(a)

上述程序生成以下结果:

24

这将把a绑定到 24。其他值被忽略,因为我们使用了'_'。

在模式匹配中,如果我们在右边使用变量,则使用其值。如果要使用左边变量的值,则需要使用固定运算符。

例如,如果您有一个值为 25 的变量“a”,并且希望将其与另一个值为 25 的变量“b”匹配,则需要输入:

a = 25
b = 25
^a = b

最后一行匹配a的当前值,而不是将其赋值给b的值。如果我们有一组不匹配的左右两侧,匹配运算符将引发错误。例如,如果我们尝试将元组与列表匹配,或者将大小为 2 的列表与大小为 3 的列表匹配,则会显示错误。

广告