如何在Erlang中实现类似C语言的if-else语句?

23

我该如何在Erlang中实现一个等价于C语言风格的if-else语句?

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

请参见此问题 - legoscia
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 

它不是一个适合复制粘贴的语言。


在 Erlang 中,相等运算符不是 =:= 吗? - Tommy
还要注意,如果没有任何条件匹配,则会出现错误,因此真正的子句作为最后一个落脚点。 - Talespin_Kit
1
@Tommy,Erlang也有====表示“等于”,=:=表示“完全等于”,有点像JavaScript的=== - Electric Coffee

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.

(在这种情况下,由于a和b是原子且永远不相等,所以expression2将始终被评估。Erlang中的变量为大写字母。)

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


4
我建议使用=:=代替==。这是一个很好的回答 - 新的Erlang程序员应该始终使用case,直到他们弄清楚if语句应该是when语句为止。 - archaelus

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.

8

另一个选项:

case a of
    b -> expr1;  %% true
    _ -> expr2   %% false
end.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接