2009-11-01 68 views
3

這是我在erlang代碼中看到的幾次,但對谷歌來說並不容易,我只能找到這個示例(下面鏈接中的第一個代碼塊):函數定義的形式參數中的模式匹配

http://www.process-one.net/en/wiki/ejabberd_HTTP_request_handlers/

在該方法的函數定義的 「頭」/ 2

process(_LocalPath = ["world"], _Request) -> 

上有第一參數/參數模式匹配;

同樣難道這種行爲像一個組織後衛,所以僅在第一個參數傳遞到處理下列條款將被執行/ 2串「世界」,或者是「世界」某種默認的說法?或者我完全誤解/錯誤猜測?

回答

4

是的,這是一個模式匹配。如果第一個參數是帶有單個元素的列表,該元素是字符串「world」,則該子句將被執行。

+2

謝謝。我沒有找到這個編碼技術 http://learnyousomeerlang.com/syntax-in-functions – 2009-11-01 17:18:26

+0

learnyousomeerlang.com與新的篇章增長的解釋/例子。 – rvirding 2009-11-05 00:07:32

2

你是對的:_LocalPath = [「world」]充當模式「警衛」。如果函數「process」的第一個參數不等於[「world」],那麼仿真器繼續查找匹配。

有一點需要注意:_LocalPath作爲「裝飾」,以增強可讀性,因爲該標識符以下劃線開始。

+0

感謝您的回覆。這是一種有用的技巧,少於警衛打字 – 2009-11-01 18:23:01

+0

你應該用「等於」代替「開始」。 – Zed 2009-11-01 18:46:30

+0

@zed:謝謝...我在這個輸入上輸入的太快了,你仍然設法打敗我;-) – jldupont 2009-11-01 18:49:16

2

一個圖案,=用於一個別名,它基本上可以讓你有你的魚與熊掌兼得。它既執行正常模式匹配,又將變量綁定到整個匹配數據。如果您需要整個數據,這是實用的,因爲它可以節省您不必重新構建的數據。你可以在一個模式中的任何地方使用它。它與警衛無關。

_LocalPath中所示,啓動變量_也告訴編譯器不要抱怨,如果未使用此變量。通常情況下,如果您綁定變量並且不使用它們,編譯器會發出一點叮囑。除此之外,變量名稱以_開頭的變量沒有特別之處,您可以像使用任何變量一樣使用它們。

唯一的真的特殊變量是_,這個匿名變量。它總是匹配,永遠不會受到約束,因此您可以將它用作匿名的佔位符。這就是爲什麼它首先存在。

我個人很少使用開始_變量和喜歡使用只是_。我也覺得用不必要的東西混淆模式是一件壞事,所以我不會使用別名來處理那些文檔。我會寫:

%% process(LocalPath, Request) -> ... .

process(["world"], _) -> 

或者一個類型聲明,如果你喜歡。我想,讓代碼更短,更清晰。

+0

謝謝,非常清楚的解釋。在功能調用中模式匹配/測試形式參數的值與在函數調用中測試形式參數的值時沒有任何優勢,其中測試值顯而易見。 – 2009-11-05 19:03:57