Elixir - 模式匹配

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

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

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

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

You can place variables inside a structure so that you can capture a substructure. For example,

[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。当我们使用"_"时,其他值将被忽略。

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

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

a = 25
b = 25
^a = b

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