1

在处理 Erlang 的案例时,我遇到了一个问题。问题如下:

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

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

4

3 回答 3

6

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

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

引用 Pragmatic Erlang 的话:

案例评估如下。首先, 计算表达式;假设这评估为Value。此后,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 中 P(X) 为真的所有元素 X 的列表。这可以使用模式匹配来编写,但case构造使代码更清晰。请注意,在模式匹配和大小写表达式之间进行选择是一个品味、风格和经验的问题。

于 2009-11-30T07:20:16.623 回答
6

可能是守卫是你想要的。

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

; - 是 OR , - 是 AND

于 2009-11-30T06:36:52.010 回答
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 回答