erlang 里的if 和 case

case Expression of

Pattern1 [when Guard1] -> Expr_seq1;

Pattern2 [when Guard2] -> Expr_seq2;

…

end
if
 Guard1 -> ...;
 Guard2 -> ...;
 ...;
end.

 Erlang 编程指南 第三章程顺序编程里有这么一个例子

%%test1(X) ->
%%    if
%%        X > 1 -> greater;
%%        X < 1 -> smaller;
%%        true -> equal
%%    end.


如果把 true 改成通配符行不行?

%%test1(X) ->
%%    if
%%        X > 1 -> greater;
%%        X < 1 -> smaller;
%%        _ -> equal
%%    end.

这将得到一个unbound 错误

如果换成case怎么实现?

test1(X) ->
    case  X of
        X > 1 -> greater;
        X < 1 -> smaller;
        _ -> equal
    end.

这样会爆 illegal pattern 的错误 X > 1 不是一个能被模式匹配的终值

应该这样

test1(1)  -> equal;
test1(X) ->
    case  (X - 1) div abs(X - 1) of
        1 -> greater;
        -1 -> smaller
    end.


这说明,if后面是每个 Guard(保护元表达式)  计算一值 然后匹配 true or false. 而case 是计算一次,然后从上往下匹配的, 每个pattern 只能是个确定值。

原文地址:https://www.cnblogs.com/bobolive/p/3156408.html