在处理 Erlang 的案例时,我遇到了一个问题。问题如下:
other languages:
switch(A)
{
case "A" : case "B" :
//do something
break;
}
那么,如何使用 Erlang 实现同样的功能呢?因为有时放置这样的条件非常重要,以避免开销。
你可以在 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构造使代码更清晰。请注意,在模式匹配和大小写表达式之间进行选择是一个品味、风格和经验的问题。
不是我最喜欢的风格,但你可以这样做:
case A of
_ when A == "A";
A == "B" -> do_ab();
_ when A == "C";
_ when A == "D" -> do_cd();
_ -> do_default()
end.