模式匹配

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 ..."}