模式匹配
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 ..."}