erlang中的案例问题

时间:2009-11-30 06:30:14

标签: erlang case

使用Erlang的情况,我遇到了一个问题。问题如下:

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

那么,如何使用Erlang实现相同的功能呢?因为有时候设置这样的条件非常重要,以避免开销。

3 个答案:

答案 0 :(得分:6)

可能是你想要的guards

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

- 是OR    , - 是AND

答案 1 :(得分:6)

可以在Erlang中使用 case 表达式。语法是:

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

引用Pragmatic Erlang:

  

案例评估如下。第一,   评估表达式;假设这个   评估为。此后, Value   与 Pattern1 相匹配   (使用可选的后卫 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);返回L中所有元素X的列表,其中P(X)为真。这可以使用模式匹配来编写,但 case 结构使代码更清晰。请注意,在模式匹配和案例表达之间进行选择是品味,风格和体验的问题。

答案 2 :(得分:3)

不是我最喜欢的风格,但你可以这样做:

case A of
  _ when A == "A";
         A == "B" -> do_ab();
  _ when A == "C";
  _ when A == "D" -> do_cd();
  _               -> do_default()
end.