说明
三元运算符_ ? _ : _ 存在于许多语言中的原因是它们有两个句法类:语句和表达式。由于 if-then-else 结构通常属于语句类,因此当您输入表达式时,没有办法让它工作。因此,您将 _ ? _ : _ 运算符添加到表达式类。
正如另一篇文章所述,您可以使用a == b ? true : false 并只写a == b,但这并不能解释我们可能有a == b ? X : Y 用于任意表达式X 和Y 的一般情况。另请注意,a == b 在 Erlang 中始终为 false,因此您可能会争辩说,真正要做的是将整个表达式替换为 false。
幸运的是,与大多数函数式语言一样,Erlang 只有一个句法类,即表达式。因此,您可以在函数的任何位置使用case a == b of X -> ...; Y -> ... end,包括其他表达式。换句话说,三元 _ ? _ : _ 运算符在 Erlang 中是多余的,因为 case 已经可以工作了。
一个例子:
假设我们要返回一个简单的 proplist,并且我们需要进行一些计算
f() ->
case a == b of
true ->
[{a, 3},
{b, <<"YE">>},
{c, 7}];
false ->
[{a, 3},
{b, <<"YE">>},
{c, "HELLO!!!"}];
end.
但由于 case 构造是一个表达式,我们可以内联它:
f() ->
[{a, 3},
{b, <<"YE">>},
{c, case a == b of
true -> 7;
false -> "HELLO!!!"
end}].
把事情做完。
为什么我不提倡使用 IF
Erlang 中的if .. end 构造通常不是您想要的。在这种情况下,您想仔细检查一个值 a == b,它可以产生两个输出之一 true 或 false。在这种情况下,case-表达式更直接。如果您必须检查多个不同的测试并选择第一个匹配项,则最好使用if,而我们这里只需要进行一个测试。