case表达式允许在子句主体内部于多个选项中进行选择,语法如下:
首先,对Expr求值,然后,Expr的值将依次与模式Pattern1、Pattern2……PatternN进行匹配,直到匹配成功。如果找到一个匹配并且(可选的)的保护式成立,则对应的调用序列将被求值。注意case保护式与函数保护式形式相同。case原语的值就是被选中的序列的值。
至少得有一个模式必须得以匹配——否则就会产生一个运行时错误并引发第??章中的错误处理机制。
举个例子,比方说我们我有个函数allocate(Resource)用于分配某种资源Resource。假设这个函数只返回{yes,Address}或no。这样,这个函数便可以放在一个case结构里:
- ...
- case allocate(Resource) of
- {yes,Address} when Address > 0, Address =< Max ->
- Sequence 1 ... ;
- no ->
- Sequence 2 ...
- end
为了避免匹配错误的发生,我们常常追加一个必会匹配的模式作为case原语的最后一个分支:
- case Fn of
- ...
- _ ->
- true
- end
if表达式的语法如下:
在这种情况下,保护式Guard1,…将被依次求值。如果一个保护式成立则对与之关联的序列求值。该序列的求值结果便是if结构的结果。if保护式与函数保护式形式相同。与case相同,一个保护式都不成立的话将引发一个错误。如果需要,可以增加保护式断言true作为垃圾箱:
- if
- ...
- true ->
- true
- end
使用case和if我们可以以多种方式来编写factorial。
- factorial(N) -> N * factorial(N - 1).
使用函数保护式:
使用if:
- factorial(N) ->
- if
- N == 0 -> 1;
- N > 0 -> N * factorial(N - 1)
- end.
使用case:
- factorial(N) ->
- case N of
- 0 -> 1;
- N when N > 0 ->
- end.
使用变量保持临时结果: