Which is more preferable? Guard or case?

goo*_*nsu 14 erlang

Style 1:

a(X) when X>1 -> 
    ...omitted;
a(X) when X ->
    ...omitted.
Run Code Online (Sandbox Code Playgroud)

Style 2

a(X) ->
    case X>1 of
        true-> ...ommited;
        false-> ...ommited
    end.
Run Code Online (Sandbox Code Playgroud)

====Update===

As @rviding said, I update the comparison as following:

Style 1:

a(X) when X>1 -> 
    ...omitted;
a(X) ->
    ...omitted.
Run Code Online (Sandbox Code Playgroud)

Style 2

a(X) ->
    case X>1 of
        true-> ...ommited;
        false-> ...ommited
    end.
Run Code Online (Sandbox Code Playgroud)

evn*_*vnu 15

了解一些Erlang关于函数语法的部分声明函数子句和case语句基本相同,除了一个区别:子句中的模式匹配可以处理多个模式,而case语句只能处理一个语句.

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

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

  • 函数子句也可以更好地调试,因为您可以跟踪它们 (4认同)
  • @evnu,"而一个case语句只能处理一个语句":那个``的案例{A,B,...,Z}怎么样? (3认同)
  • @goofansu但在这种情况下避免`当X`守卫.只有当`X`的值为'true'时才会成功. (2认同)

Pas*_*cal 6

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

我最近学到了这个,例如(length(L) > -1)在一个函数内部崩溃但在L是一个不正确的列表时没有在一个守卫中崩溃.