erlang判断语法结构:if/case/guard

erlang 有好几种常用的判断结构语句,如 if、case、guard 等。文章将分别对 if / case /guard 的特点做介绍,以及用例说明

1、if 结构

[plain] view plaincopy
 
  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. end  

Erlang是这样工作的:先对Condition 1求值,如值为true,那么将执行Action 1,并跳出该结构。若Condition 1不成功,那么就继续对Condition 2求职,以此类推,直到有条件成功。在if结构中,知道要有一个结果为true,否则Erlang就会抛出一个异常。通常if语句的最后一个条件会是原子true,表示如果没有匹配的条件的话,应该做什么动作。

2、 case 结构

[plain] view plaincopy
 
  1. case Condition of   
  2.      Result 1 ->  
  3.            Action 1;        
  4.      Result 2 ->  
  5.            Action 2;  
  6.      Result 3 ->  
  7.            Action 3  
  8. end  

Erlang是这样工作的:首先,对Condition进行求值,然后将结果依次对Result 1、Result 2等进行匹配,直到找到可以匹配的分支。我们可以把变量_放到最下面的条件层,用来处理没有匹配条件要执行的动作。

3、guard 结构

[plain] view plaincopy
 
  1. max(X, Y) when X > Y -> X;  
  2. max(X, Y) -> Y.  

守卫(guard)是一种用于强化模式匹配功能的结构。如果点第一个子句不匹配,那么erlang会尝试匹配第二个子句。通常把没有任何限定条件的函数放最下面,用来处理没有匹配条件要执行的动作。

下面简单写了一个例子来说明:

[plain] view plaincopy
 
    1. -module(compare).  
    2.   
    3. -export([compare/2, compare2/2, compare3/2]).  
    4.   
    5. %% if 语句  
    6. compare(A, B) ->  
    7.     if A > B ->  
    8.             io:format("~p > ~p~n", [A, B]);  
    9.        A < B ->  
    10.             io:format("~p < ~p~n", [A, B]);  
    11.        true ->  
    12.             io:format("~p = ~p~n", [A, B])  
    13.     end.  
    14.   
    15. %% guard 语句  
    16. compare2(A, B) when A > B ->  
    17.     io:format("~p > ~p~n", [A, B]);  
    18. compare2(A, B) when A < B ->  
    19.     io:format("~p < ~p~n", [A, B]);  
    20. compare2(A, B) ->  
    21.     io:format("~p = ~p~n", [A, B]).  
    22.   
    23. %% case 语句  
    24. compare3(A, B) ->  
    25.     case A > B of  
    26.         true ->  
    27.             io:format("~p > ~p~n", [A, B]);  
    28.         _ ->  
    29.             case A < B of  
    30.                 true ->  
    31.                     io:format("~p < ~p~n", [A, B]);  
    32.                 _ ->  
    33.                     io:format("~p = ~p~n", [A, B])  
    34.             end  
    35.     end.  
原文地址:https://www.cnblogs.com/xuan52rock/p/4601869.html