在erlang中,至少有三种可互换的流程控制方式:函数声明上的pattern match,case语句,if语句
这里讲将case语句和函数声明上的pattern match的区别。
case语句的格式如下:
case conditional-expression of Pattern1 -> expression1, expression2, .. ;, Pattern2 -> expression1, expression2, .. ; ... ; Patternn -> expression1, expression2, .. end
执行的过程是,将conditional-expression挨个和Pattern-n去做match,如果match上了,就执行相应的代码段,如果没有match,就尝试下一个Pattern,直到最后。
例如程序:
area (Shape) -> case Shape of {circle,R} -> math:pi()*R*R; {square,Side} -> Side * Side; Other -> {error,unknown_shape,Other} end.
同样的功能,用函数声明上的pattern match来实现:
area2 ({circle,R}) -> math:pi()*R*R; area2 ({square,Side}) -> Side * Side; area2 (Other) -> {error,unknown_shape,Other}.
哪一种更好呢?
没答案,如果有的话,就是看情况。
erlang中的case与函数声明上的pattern match的主要区别有:
*case用来匹配的表达式只能是一个,而函数可以若干个
*case可以用在程序中的任何地方,而函数只能在声明的地方
主要就这么两点区别,其他的几乎一样了。
另外,下面的代码好么?为什么?
convert(Day) -> case Day of monday -> 1; tuesday ->2; wednesday ->3; thursday ->4; friday ->5; saturday ->6; sunday ->7; Other -> {error,unknow_day} end.