Erlang筆記(05) - Erlang條件判斷: if, case, when
阿新 • • 發佈:2019-01-12
1. if 語句
- if 的格式,Action 執行的結果就是 if 語句的返回值
-
[plain]
view plain
copy
- if
- Condition 1 ->
- Action 1;
- Condition 2 ->
- Action 2;
- Condition 3 ->
- Action 3;
- Condition 4 ->
- Action 4
- true -> ... %保護斷言%
- end
-
[plain]
view plain
copy
- 舉例:
-
[plain]
view plain
copy
- -module(tmp).
- -export([test_if/2]).
- test_if(A, B) ->
- if
- A == 5 ->
- io:format("A = 5~n", []),
- a_equals_5;
- B == 6 ->
- io:format("B = 6~n", []),
- b_equals_6;
- A == 2, B == 3 -> %i.e. A equals 2 and B equals 3
- io:format("A == 2, B == 3~n", []),
- a_equals_2_b_equals_3;
- A == 1 ; B == 7 -> %i.e. A equals 1 or B equals 7
- io:format("A == 1 ; B == 7~n", []),
- a_equals_1_or_b_equals_7
- end.
- % tmp:test_if(51,31). % 執行結果
- % ** exception error: no true branch found when evaluating an if expression
- % in function tmp:test_if/2 (tmp.erl, line 4)
-
[plain]
view plain
copy
2. case 語句
- case 的格式
-
[plain]
view plain
copy
- case conditional-expression of
- Pattern1 -> expression1, expression2, .. ;,
- Pattern2 -> expression1, expression2, .. ;
- ... ;
- Patternn -> expression1, expression2, ..
- end.
-
[plain]
view plain
copy
- 舉例:
-
[plain]
view plain
copy
- -module(temp).
- -export([convert/1]).
- convert(Day) ->
- case Day of
- monday -> 1;
- tuesday -> 2;
- wednesday -> 3;
- thursday -> 4;
- friday -> 5;
- saturday -> 6;
- sunday -> 7;
- Other -> {error, unknown_day}
- end.
-
[plain]
view plain
copy
3. when 語句
- when 的格式
-
[plain]
view plain
copy
- February when IsLeapYear == true -> 29;
- February -> 28;
-
[plain]
view plain
copy
- 舉例:斐波那契數列
-
[plain]
view plain
copy
- % factorial(0) -> 1;
- % factorial(N) -> N * factorial(N-1).
- % 重寫上面的函式,因為上面函式有個缺陷,當輸入factorial(負數)會導致死迴圈
- factorial(N) when N > 0 -> N * factorial(N - 1);
- factorial(0) -> 1.
-
[plain]
view plain
copy
- 可以使用的條件:
- 判斷資料型別(內建函式):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原語中引入的變數會被隱式匯出到原語主體之外