模式匹配
erlang 中最常见的操作之一是模式匹配。它在为变量,函数声明和控制流结构(如 case
和 receive
语句)赋值时使用。模式匹配操作至少需要 2 个部分:模式和模式匹配的术语。
erlang 中的变量赋值如下所示:
X = 2.
在大多数编程语言中,此操作的语义很简单:将值(2
)绑定到你选择的名称(变量 - 在本例中为 X
)。Erlang 的方法略有不同:将左侧的图案(X
)与右侧的图案(2
)相匹配。在这种情况下,效果是相同的:变量 X
现在绑定到值 2
。但是,通过模式匹配,你可以执行更多结构化分配。
{Type, Meta, Doc} = {document, {author, "Alice"}, {text, "Lorem Ipsum"}}.
通过分析右手侧项的结构,并将左侧的所有变量应用于该项的适当值,使得左侧等于右侧,来执行该匹配操作。在这个例子中,Type
绑定到术语:document
,Meta
到 {author, "Alice"}
和 Doc
到 {text, "Lorem Ipsum"}
。在这个特定的例子中,假设变量:Type
,Meta
和 Doc
是未绑定的,因此可以使用每个变量。
也可以使用绑定变量构建模式匹配。
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 ..."}