哪个更优选?警卫或案件?

时间:2012-09-11 06:26:17

标签: erlang

风格1:

a(X) when X>1 -> 
    ...omitted;
a(X) when X ->
    ...omitted.

风格2

a(X) ->
    case X>1 of
        true-> ...ommited;
        false-> ...ommited
    end.

====更新===

正如@rviding所说,我将比较更新如下:

风格1:

a(X) when X>1 -> 
    ...omitted;
a(X) ->
    ...omitted.

风格2

a(X) ->
    case X>1 of
        true-> ...ommited;
        false-> ...ommited
    end.

2 个答案:

答案 0 :(得分:14)

Learn You Some Erlang's section on function syntax表示函数子句和case语句基本相同,除了一个区别:子句中的模式匹配可以处理多个模式,而case语句只能处理一个语句。

除此之外,我认为这是一个品味问题。当案例真的不同时,我倾向于使用不同的函数子句(如:完整函数将表现不同),当我希望代码发散并在之后再次合并时,我使用case语句,例如:根据表达式计算变量的值。

修改 正如RobertAloi在下面的评论中指出的那样,使用case .. of时你并没有受到真正的限制。另外,正如rvirding写的那样,编译器在元组中包含不同的表达式时会做一些优化,以允许匹配它们。

答案 1 :(得分:6)

您还应该考虑测试BIF的结果在保护中的行为与在函数内部完全不同。

我最近学到了这一点,例如{L}是一个不合适的列表时,(length(L) > -1)在一个函数内部崩溃但在一个守护程序中崩溃。