23

如何在 Erlang 中制作相当于C 风格的 if-else?

 if(a == b) {
   expression1
 } else {
   expression2 
 }
4

4 回答 4

33
if
    a == b ->
        expr1;
    true ->
        exprElse
end

Erlang 中没有真正的 else,你只需匹配 true。Erlang 文档中的更多信息。

你必须密切注意';' 终结者:

if
    a == b ->
        clauseN,
        expr1;
    cond2 ->
        clause1,
        clause2,
        expr2;
    cond3 ->
        expr3;
    true ->
        exprElse
end 

它不是一种复制粘贴友好的语言。

于 2009-06-08T08:44:46.710 回答
19

模式匹配是 Erlang 的众多优势之一,它通常可以用来代替 if 语句。对函数参数进行模式匹配或使用 case 表达式(这也是模式匹配)通常更具可读性。

假设您有一个带有some_function两个参数的函数。如果参数相等,则计算表达式 1,否则计算表达式 2。这可以用 erlang 表示为:

some_function(A, A) -> expression1;
some_function(A, B) -> expression2.

使用这种简单的模式匹配可以达到多少效果,真是令人惊讶。使用保护子句,您可以表达更复杂的模式,例如,

some_function(A, B) when A < B -> expression3. 

另一种可能性是使用case .. of表达式。您的特定示例将转化为

case a == b of
    true -> expression1;
    false -> expression2
end.

(在这种情况下expression2,总是会被求值,因为ab是原子并且永远不会彼此相等。Erlang 中的变量是大写的。)

您可以在此处阅读有关 Erlang 表达式的更多信息。

于 2009-06-08T15:08:21.973 回答
15
if
    A =:= B ->
        expr1;
    true ->
        expr2
end 

或者

case A =:= B of
    true -> expr1;
    false -> expr2
end

或者

case A of
    B -> expr1;
    _ -> expr2
end

或者

  foo(A,B), ...

...
foo(X,X) -> expr1;
foo(_,_) -> expr2.
于 2009-06-08T14:29:25.827 回答
8

另外的选择:

case a of
    b -> expr1;  %% true
    _ -> expr2   %% false
end.
于 2009-07-08T06:17:43.087 回答