2012-09-11 9 views
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. 
節とcase文を機能

スタイル2つの

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

答えて

14

Learn You Some Erlang's section on function syntax状態は、一つ違いを除いて、基本的に同じである:case文が一つだけステートメントを処理することができ、一方、句でパターンマッチングが、複数のパターンを扱うことができます。

とは別に、私はそれは好みの問題であると考えています。 (のように:完全な機能は異なる動作をします)私は例が実際に異なっているときに、異なる機能句を使用する傾向がある、と私は発散すると、例えば、再び後でマージするコードをしたいとき、私はケース文を使用します式に基づいて変数の値を計算します。

編集 としてはcase .. ofを使用しているときは本当に限定されるものではなく、下記のコメントでRobertAloiによって指摘しました。また、rvirdingが書いているように、コンパイラは、異なる式をタプルにラップしてそれらと照合できるようにするときにいくつかの最適化を行います。

+0

ありがとうございます。私は個人的には関数節をより明確にする傾向があります。あなたのアドバイスは私に決定を下すのに十分です。 – goofansu

+4

関数句もデバッグする方が良いです。 – Lukas

+2

@goofansuですが、この場合は 'when X'ガードを避けてください。 'X'の値が' true'の場合にのみ成功します。 – rvirding

6

また、BIFの結果をテストする関数内よりもガードでまったく同じ振る舞いをしていないことを考慮すべきです。

私は、最近、このことを学んだ関数内例えば(length(L) > -1)クラッシュしたが、ガードでLは、不適切なリストではないとき。

+0

警告ありがとうございます – goofansu

関連する問題