1

Erlang のケースを扱っていると、問題に直面しています。問題は次のとおりです。

other languages:
switch(A) 
{
  case "A" : case "B" :
   //do something
  break;
}

では、Erlang を使用して同じことを達成するにはどうすればよいでしょうか? オーバーヘッドを避けるために、このような条件を設定することが非常に重要な場合があるためです。

4

3 に答える 3

6

警備はあなたが望むものかもしれません。

the_answer_is(N) when A == "A"; A == "B";

; - は OR 、 - は AND

于 2009-11-30T06:36:52.010 に答える
6

Erlangではcase式を使用できます。構文は次のとおりです。

case Expression of
    Pattern1 [when Guard1] -> Expr_seq1;
    Pattern2 [when Guard2] -> Expr_seq2;
    ...
end

Pragmatic Erlang を引用するには:

ケースは次のように評価されます。まず、 が評価されます。これがValueに評価されると仮定します。その後、一致が見つかるまで、 ValuePattern1 (オプションのガードGuard1を使用)、 Pattern2などと順番に照合されます。一致が見つかるとすぐに、対応する式シーケンスが評価されます。式シーケンスを評価した結果が、case 式の値になります。どのパターンも一致しない場合は、例外が発生します。

例:

filter(P, [H|T]) ->
    case P(H) of
        true -> [H|filter(P, T)];
        false -> filter(P, T)
    end;
filter(P, []) ->
    [].

フィルター(P、L); P(X) が真である L のすべての要素 X のリストを返します。これはパターン マッチングを使用して記述できますが、case構造によりコードがより簡潔になります。パターン マッチングと case 式のどちらを選択するかは、好み、スタイル、および経験の問題であることに注意してください。

于 2009-11-30T07:20:16.623 に答える
4

私の好きなスタイルではありませんが、次のようなことができます:

case A of
  _ when A == "A";
         A == "B" -> do_ab();
  _ when A == "C";
  _ when A == "D" -> do_cd();
  _               -> do_default()
end.
于 2009-11-30T07:27:05.923 に答える