iT邦幫忙

DAY 10
1

蠻可愛的 Erlang 與 Elixir系列 第 10

邏輯判斷式 case 與 if

到目前為止都用模式比對,但都用模式比對有時候也不方便.
所以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未能處理的
狀況,像是做紀錄或是顯示訊息等等的情況類似.


上一篇
List comprehension與守衛(Guard)
下一篇
尾遞迴
系列文
蠻可愛的 Erlang 與 Elixir30

尚未有邦友留言

立即登入留言