14

スタイル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.
4

2 に答える 2

15

Learn You関数構文に関するErlangのセクションでは、関数句とcaseステートメントは基本的に同じであると述べていますが、1つの違いがあります。句のパターンマッチングでは複数のパターンを処理できますが、caseステートメントでは1つのステートメントしか処理できません。

それとは別に、それは好みの問題だと思います。ケースが本当に異なる場合(たとえば、完全な関数の動作が異なる場合)は異なる関数句を使用する傾向があり、コードを分岐して後で再度マージする場合、たとえば、の値を計算する場合は、caseステートメントを使用します。式に基づく変数。

編集 以下のコメントでRobertAloiが指摘しているように、を使用する場合は実際には制限されませんcase .. of。また、rvirdingが書いたように、コンパイラーは、異なる式をタプルでラップするときに、それらとの照合を可能にするためにいくつかの最適化を行います。

于 2012-09-11T06:58:57.783 に答える
6

また、BIFの結果をテストすることは、関数内よりもガード内でまったく同じ動作をしないことを考慮する必要があります。

私は最近これを学びました。たとえば(length(L) > -1)、Lが不適切なリストである場合、関数内でクラッシュしますが、ガードではクラッシュしません。

于 2012-09-12T04:15:10.357 に答える