1. 程式人生 > >Erlang筆記(05) - Erlang條件判斷: if, case, when

Erlang筆記(05) - Erlang條件判斷: if, case, when

1. if 語句

  • if 的格式,Action 執行的結果就是 if 語句的返回值
    • [plain]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
      1. if  
      2.   Condition 1 ->  
      3.     Action 1;  
      4.   Condition 2 ->  
      5.     Action 2;  
      6.   Condition 3 ->  
      7.     Action 3;  
      8.   Condition 4 ->  
      9.     Action 4  
      10.   true -> ...   %保護斷言
      11. end  
  • 舉例:
    • [plain]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
      1. -module(tmp).  
      2. -export([test_if/2]).  
      3. test_if(A, B) ->  
      4. if  
      5.     A == 5 ->  
      6.         io:format("A = 5~n", []),  
      7.         a_equals_5;  
      8.     B == 6 ->  
      9.         io:format("B = 6~n", []),   
      10.         b_equals_6;  
      11.     A == 2, B == 3 -> %i.e. A equals 2 and B equals 3  
      12.         io:format("A == 2, B == 3~n", []),   
      13.         a_equals_2_b_equals_3;  
      14.     A == 1 ; B == 7 -> %i.e. A equals 1 or B equals 7  
      15.         io:format("A == 1 ; B == 7~n", []),   
      16.         a_equals_1_or_b_equals_7  
      17. end.  
      18.   
      19. % tmp:test_if(51,31). % 執行結果  
      20. % ** exception error: no true branch found when evaluating an if expression   
      21. % in function  tmp:test_if/2 (tmp.erl, line 4)  

2. case 語句

  • case 的格式
    • [plain]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
      1. case conditional-expression of  
      2.   Pattern1 -> expression1, expression2, .. ;,  
      3.   Pattern2 -> expression1, expression2, .. ;  
      4.   ... ;  
      5.   Patternn -> expression1, expression2, ..  
      6. end.  
  • 舉例:
    • [plain]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
      1. -module(temp).  
      2. -export([convert/1]).  
      3.   
      4. convert(Day) ->  
      5.     case Day of  
      6.         monday -> 1;  
      7.         tuesday -> 2;  
      8.         wednesday -> 3;  
      9.         thursday -> 4;  
      10.         friday -> 5;  
      11.         saturday -> 6;  
      12.         sunday -> 7;  
      13.         Other -> {error, unknown_day}  
      14.     end.  

3. when 語句

  • when 的格式
    • [plain]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
      1. February when IsLeapYear == true -> 29;  
      2. February -> 28;  
  • 舉例:斐波那契數列
    • [plain]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
      1. % factorial(0) -> 1;  
      2. % factorial(N) -> N * factorial(N-1).  
      3.   
      4. % 重寫上面的函式,因為上面函式有個缺陷,當輸入factorial(負數)會導致死迴圈  
      5. factorial(N) when N > 0  -> N * factorial(N - 1);  
      6. factorial(0) -> 1.  
  • 可以使用的條件:
    • 判斷資料型別(內建函式):is_binary, is_atom, is_boolean, is_tuple
    • 比較運算子:==, =/=, <, >...
    • 判斷語句: not, and, xor......

4. Build-in Functions (BIFs) 內建函式

  • 內建函式屬於 erlang 模組的函式,直接呼叫或者間接呼叫都可以,比如 trunc 等同於 erlang:trunc
    • 舉例:
    • trunc:取整數部分
    • round:四捨五入
    • float:轉化為浮點數
    • is_atom:判斷是否為原子
    • is_tuple:判斷是否為元組
    • hd/1:返回列表的第一個元素
    • tl/1:返回列表的最後一個元素
    • length/1:返回列表的長度
    • tuple_size/1:返回元組的大小
    • element/2:返回第n個元組的元素
    • setelement/3:替換元組中的某個元素,並返回新元組。stelement(要替換原子的位置,元組名,新原子的值)
    • erlang:append_element/2:新增一個原子到元組的末尾。(元組名,新原子的值)
    • 型別轉換
      • atom_to_list:原子轉換為列表->字串
      • list_to_atom:列表轉換為原子
      • integer_to_list:整數轉換為列表
      • list_to_tuple, tuple_to_list.
      • float, list_to_float, float_to_list, integer_to_list

5. 守衛

  • 逗號:依次判斷每個表示式為真,並向後執行
    • 比如:guard2(X,Y) when not(X>Y) , X>0 -> X+Y  % X<=Y 並且 X>0 時就執行 X+Y
  • 分號:執行其中一個為真的表示式
    • 比如:guard2(X,Y) when not(X>Y) ; X>0 -> X+Y % X<=Y 或者 X>0 時就執行 X+Y

6. 在if、case或receive原語中引入的變數會被隱式匯出到原語主體之外