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)

这将在var_1中存储值{"First variable"},在var_2中存储 "Second variable"。还有一个特殊的_变量(或以 '_' 为前缀的变量),其工作方式与其他变量完全相同,但告诉 elixir,“确保这里有东西,但我不关心它到底是什么。” 。在前面的示例中,_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

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