14

风格一:

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

风格 2

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

====更新===

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

风格一:

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

风格 2

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

2 回答 2

15

Learn You Some Erlang 关于函数语法的部分指出,函数子句和 case 语句基本相同,除了一个区别:子句中的模式匹配可以处理多个模式,而 case 语句只能处理一个语句。

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

编辑 正如 RobertAloi 在下面的评论中指出的那样,使用case .. of. 此外,正如 rvirding 所写,编译器在将不同的表达式包装在一个元组中以允许匹配它们时进行了一些优化。

于 2012-09-11T06:58:57.783 回答
6

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

我最近了解到这一点,例如(length(L) > -1),当 L 是不正确的列表时,函数内部崩溃但守卫不崩溃。

于 2012-09-12T04:15:10.357 回答