- Erlang中定义函数时可以使用模式匹配,形式如下:
1 | function(X) -> |
其中的每一条函数声明都被称作一个函数子句(function clause)。函数子句之间必须用分号
;分隔,所有函数子句一起形成一个完整的函数定义,最后一个函数子句必须以句点.结尾在Erlang中变量的值永远不能改变!
如果给一个已经绑定的变量赋值,除非这个新值和变量原有的值相同,否则就会引发错误
在函数头中可以使用
=操作符,这样可以在匹配元组内部元素({X, Y})的同时,匹配整个元组
1 | point(Point = {X, Y}) -> |
卫语句是附加在函数头中的语句,能够让模式匹配更具表达力
卫表达式有一条基本规则,想要成功,它必须返回
true。如果返回了false或者抛出了异常,就表明卫语句失败
1 | old_enough(X) when X >= 16, X =< 104 -> true; |
- 在卫表达式中,逗号(
,)的作用和操作符andalso类似,分号(;)和orelse类似
1 | wrong_age(X) when X < 16; Y > 104 -> true; |
函数可以带有任意多个由逗号分隔的卫表达式,这些卫表达式必须都是成功,整个卫语句才能通过
卫语句除了使用比较和布尔操作,还可以使用算术运算符(
A*B/C >= 0)和判断数据类型的函数(is_integer/1,is_atom/1)卫语句有一个缺点,考虑到副作用方面的原因,卫语句中不能使用用户自定义函数
if语句又称为卫模式(guard pattern),if语句的作用和卫语句类似,和卫语句的语法也一样,但是它在函数子句头之外使用Erlang中的
if和其他大多数语言中见到的if不同,和那些if语句相比,Erlang版本的if像个怪物
1 | -module(what_the_if). |
Erlang中每个表达式都必须有返回值,
if表达式也不例外当Erlang无法让卫表达式成功时就会崩溃
其他语言中的
else在Erlang会使用true
1 | oh_god(N) -> |
- Erlang的
if表达式可以有多个卫语句。再次强调!任何表达式都必须要有返回值
1 | help_me(Animal) -> |
Erlang中没有像null值(如:Lisp中的
nil,C中的NULL或者Python中的None)这样的东西case...of表达式就像函数头,可以使用复杂的模式匹配,还可以使用卫语句
1 | beach(Temperature) -> |