到目前為止都用模式比對,但都用模式比對有時候也不方便.
所以erlang裡也有case與if.
case語法如下:
case Expression of
Pattern1 [when Guard1] -> Expr_seq1;
Pattern1 [when Guard1] -> Expr_seq1;
...
end
我們來看一個簡單的面積計算程式,分別使用模式比對搭配Guard;
以及case搭配模式比對與Guard,兩種寫法.
-module(p1010a).
-export([area/3]).
area(rectangle, L, W) when L >= 0, W >= 0 ->
L * W;
area(triangle, B, H) when B >= 0, H >= 0 ->
(B * H) / 2.0;
area(ellipse, A, B) when A >= 0, B >= 0 ->
math:pi() * A * B.
-- 以下是使用case
-module(p1010b).
-export([area/3]).
area(Shape, A, B) when A >= 0, B >= 0 ->
case Shape of
rectangle -> A * B;
triangle -> (A * B) / 2.0;
ellipse -> math:pi() * A * B
end.
執行與編譯:
1> c("p1010a").
{ok,p1010a}
2> c("p1010b").
{ok,p1010b}
3> p1010a:area(rectangle,5,4).
20
4> p1010b:area(rectangle,5,4).
20
效果是一樣的.但是使用了case,程式碼更簡潔,可讀性更好.
erlang 也提供了if語法,語法如下:
if
Guard1 ->
Expr_seq1;
Guard2 ->
Expr_seq2;
...
end
erlang 會先評估Guard1,如果為true,那就依據Expr_seq1返回;
若Guard1是false,就繼續評估Guard2,依此類推,直到一個Guard
為true為止;若都沒有Guard為true,就會拋出exception!
所以一般都是最後一個Guard會放ture.
與一般程式語言的if else,最後的else來攔截上面的if未能處理的
狀況,像是做紀錄或是顯示訊息等等的情況類似.