我该如何在Erlang中实现一个等价于C语言风格的if-else语句?
if(a == b) {
expression1
} else {
expression2
}
我该如何在Erlang中实现一个等价于C语言风格的if-else语句?
if(a == b) {
expression1
} else {
expression2
}
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
它不是一个适合复制粘贴的语言。
=:=
吗? - Tommy==
,==
表示“等于”,=:=
表示“完全等于”,有点像JavaScript的===
。 - Electric Coffee模式匹配是 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表达式的更多信息。
=:=
代替==
。这是一个很好的回答 - 新的Erlang程序员应该始终使用case
,直到他们弄清楚if
语句应该是when
语句为止。 - archaelusif
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.
另一个选项:
case a of
b -> expr1; %% true
_ -> expr2 %% false
end.