2012-09-11 21 views
14

樣式1:哪一個更可取?守衛或案件?

a(X) when X>1 -> 
    ...omitted; 
a(X) when X -> 
    ...omitted. 

樣式2

a(X) -> 
    case X>1 of 
     true-> ...ommited; 
     false-> ...ommited 
    end. 

====更新===

正如@rviding說,我更新的比較如下:

風格1:

a(X) when X>1 -> 
    ...omitted; 
a(X) -> 
    ...omitted. 

樣式2所

a(X) -> 
    case X>1 of 
     true-> ...ommited; 
     false-> ...ommited 
    end. 

回答

14

Learn You Some Erlang's section on function syntax指出功能的條款和case語句基本上是相同的,除了一點不同:在子句模式匹配可以處理一個以上的圖案,而case語句只能處理一個語句。

除此之外,我相信這是一個品味問題。當情況真的不同時,我傾向於使用不同的函數子句(例如:完整函數的行爲不同),並且當我希望代碼發散並在之後再次合併時使用case語句。根據表達式計算變量的值。

編輯 如在下面的評論中指出RobertAloi,你是不是真的使用case .. of時受到限制。另外,正如rvirding所寫,編譯器在將不同的表達式包裝到一個元組中以進行匹配時會進行一些優化。

+0

謝謝。我個人傾向於功能條款,因爲它更清楚。你的建議足以讓我做出決定。 – goofansu

+4

函數子句也可以更好地進行調試,因爲你可以在它們上面追蹤 – Lukas

+2

@goofansu,但是在這種情況下避免了'when X' guard。只有當'X'的值爲'true'時它纔會成功。 – rvirding

6

您還應該考慮測試BIF的結果在警衛中的行爲與在功能中的行爲不完全相同。

我最近了解到這一點,例如(length(L) > -1)在函數內部崩潰,但當L是不正確的列表時,不在警衛中。

+0

謝謝你的警告 – goofansu