Erlang笔记(05) - Erlang条件判断: if, case, when

来源:互联网 发布:商城类网站源码 编辑:程序博客网 时间:2024/05/17 08:34

1. if 语句

  • if 的格式,Action 执行的结果就是 if 语句的返回值
    • [plain] view plaincopy在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 plaincopy在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 plaincopy在CODE上查看代码片派生到我的代码片
      1. case conditional-expression of  
      2.   Pattern1 -> expression1, expression2, .. ;,  
      3.   Pattern2 -> expression1, expression2, .. ;  
      4.   ... ;  
      5.   Patternn -> expression1, expression2, ..  
      6. end.  
  • 举例:
    • [plain] view plaincopy在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 plaincopy在CODE上查看代码片派生到我的代码片
      1. February when IsLeapYear == true -> 29;  
      2. February -> 28;  
  • 举例:斐波那契数列
    • [plain] view plaincopy在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原语中引入的变量会被隐式导出到原语主体之外

0 0
原创粉丝点击