📜  Elixir-模式匹配

📅  最后修改于: 2020-11-04 08:22:28             🧑  作者: Mango


 

模式匹配是Elixir从Erlang继承的技术。这是一项非常强大的技术,它使我们能够从复杂的数据结构(如列表,元组,地图等)中提取更简单的子结构。

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

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

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中。还有一个特殊的_变量(或带有’_’前缀的变量),其作用与其他变量完全相同,但告诉长生不老药: “请确保此处有内容,但我并不在乎它到底是什么。” 。在前面的示例中, _unused_var是一个这样的变量。

我们可以使用这种技术来匹配更复杂的模式。例如,如果您想解包并在列表本身的列表中的元组中获取数字,则可以使用以下命令-

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

上面的程序产生以下结果-

24

这会将a绑定到24。在使用“ _”时,其他值将被忽略。

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

例如,如果您有一个值为25的变量“ a”,并且想要将其与值为25的另一个变量“ b”进行匹配,那么您需要输入-

a = 25
b = 25
^a = b

最后一行当前值相匹配,而不是分配给它,b的值。如果我们左右手的一组不匹配,则match运算符会引发错误。例如,如果我们尝试将一个元组与一个列表或大小为2的列表与大小为3的列表进行匹配,则会显示错误。