在大多数程序设计语言中,都会具有分支结构的程序语法,即if语句和case语句。Erlang 语言中也有if语句和case语句。
一、if语句
基本格式如下:
if
Guard1 -> exp1,exp2;
Guard2 -> expa,expb;
...
end
Guard1,Guard2依次进行计算,如果有一个为true,则计算其后的各个表达式。但如果没有一个为true则会引发错误。所以,有时会在最后添加如下分支:
true -> "error ..."
true之前没有为真的话,该分支会执行,而不会引发错误。
以下是一个测试返回奇偶数标志的if语句:
if
X rem 2 == 1 -> odd;
X rem 2 == 0 ->even
end.
二、case语句
基本格式如下:
case exp of
Pattern1 -> exp1,exp2;
Pattern2 -> expa,expa;
....
end.
该语句在执行时,首先计算exp的值,然后用exp的结果依次与Pattern1、Pattern2进行模式匹配,成功则计算其后的表达式;和if语句类似的是,如果没有一个分支的模式匹配成功,则会引发错误。因此,有时会添加一个任何情况下都会匹配的分支,主要有以下两种形式:
1. _ ->"error...."
2. Other -> "...."
if语句和case语句通常是可以互换的,即if可以实现的功能,case也可以实现。如何选用,那要看具体情况。
三、保护式
在前面介绍函数中的模式匹配时提到,通过模式匹配可以达到选择函数的某个子句执行,但模式匹配不能实现数值大小与数值类型的选择。而我们可以使用保护式来实现这个功能。
如在定义某个函数时,要求传入变量的值必须大于0,否则返回错误,你可以这样写:
myfun(X) when X>0 ->
...;
myfun(X) -> "error".
当传入的参数值不大于0时,第一个子句因保护式的作用而不被执行,实际会执行第二个子句。
保护式还可以包含多个保护条件,如果多个条件之间是用‘,’分隔,则多个条件全成立,结果为true。如果多个条件之间用‘;’分隔,则只要有一个条件为true,结果为true。
如果在保护式中需要指定数据类型,则可以可使用Erlang中的内建函数来对数据的类型进行判断,如is_atom/1、is_tuple/1等,当然条件中还可以使用算术运算符、比较运算符、布尔表达式等。这里就不一一举例说明了。