如何在 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
它不是一种复制粘贴友好的语言。
模式匹配是 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
,总是会被求值,因为a
和b
是原子并且永远不会彼此相等。Erlang 中的变量是大写的。)
您可以在此处阅读有关 Erlang 表达式的更多信息。
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.
另外的选择:
case a of
b -> expr1; %% true
_ -> expr2 %% false
end.