【问题标题】:Which is more preferable? Guard or case?哪个更可取?警卫还是箱子?
【发布时间】:2015-07-03 11:33:54
【问题描述】:

样式一:

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

样式 2

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

====更新===

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

样式一:

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

样式 2

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

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

    编辑 正如 RobertAloi 在下面的 cmets 中指出的那样,使用 case .. of 时您并没有真正受到限制。此外,正如 rvirding 所写,编译器在将不同的表达式包装在一个元组中以允许对它们进行匹配时会进行一些优化。

    【讨论】:

    • 谢谢。我个人倾向于功能条款,因为它更清楚。您的建议足以让我做出决定。
    • 函数子句也可以更好地调试,因为您可以跟踪它们
    • @goofansu 但在这种情况下避免使用when X 守卫。只有X 的值为true,它才会成功。
    • @evnu, “而 case 语句只能处理一个语句”:case {A,B,...,Z} of ... 呢?
    • @RobertoAloi 你把我带到了那里。你的批评是正确的。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 2012-09-14
      • 2014-05-16
      • 2011-03-26
      • 2012-06-12
      • 2010-09-29
      • 2011-03-14
      • 2010-11-16
      相关资源
      最近更新 更多