模式匹配

erlang 中最常见的操作之一是模式匹配。它在为变量,函数声明和控制流结构(如 casereceive 语句)赋值时使用。模式匹配操作至少需要 2 个部分:模式和模式匹配的术语。

erlang 中的变量赋值如下所示:

X = 2.

在大多数编程语言中,此操作的语义很简单:将值(2)绑定到你选择的名称(变量 - 在本例中为 X)。Erlang 的方法略有不同:将左侧的图案(X)与右侧的图案(2)相匹配。在这种情况下,效果是相同的:变量 X 现在绑定到值 2。但是,通过模式匹配,你可以执行更多结构化分配。

{Type, Meta, Doc} = {document, {author, "Alice"}, {text, "Lorem Ipsum"}}.

通过分析右手侧项的结构,并将左侧的所有变量应用于该项的适当值,使得左侧等于右侧,来执行该匹配操作。在这个例子中,Type 绑定到术语:documentMeta{author, "Alice"}Doc{text, "Lorem Ipsum"}。在这个特定的例子中,假设变量:TypeMetaDoc未绑定的,因此可以使用每个变量。

也可以使用绑定变量构建模式匹配。

Identifier = error.

变量 Identifier 现在绑定到值 error。以下模式匹配操作起作用,因为结构匹配,并且绑定变量 Identifier 具有与该术语的适当右侧部分相同的值。

{Identifier, Reason} = {error, "Database connection timed out."}.

当右手侧项和左手侧模式之间存在不匹配时,模式匹配操作失败。以下匹配将失败,因为 Identifier 绑定到值 error,右侧术语没有适当的表达。

{Identifier, Reason} = {fail, "Database connection timed out."}.
> ** exception error: no match of right hand side value {fail,"Database ..."}