有没有一种在Erlang中编写这样的代码的好方法?
A == B ? X : Y
Run Code Online (Sandbox Code Playgroud)
下面是ruby风格的代码
I G*_*ERS 35
三元运算符_ ? _ : _存在于多种语言中的原因是它们有两个句法类:语句和表达式.由于if-then-else结构通常属于语句类,因此在输入表达式时无法使其工作.因此,您将_ ? _ : _运算符添加到表达式类.
作为另一篇文章的状态,你可以采取a == b ? true : false和只写a == b,但是,这并不说明我们可能有一般情况下a == b ? X : Y对任意表达式X和Y.还要注意,a == b总是false在Erlang中,所以你可以说真正要做的就是替换整个表达式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.
Run Code Online (Sandbox Code Playgroud)
但由于case构造是一种表达,我们可以将其内联:
f() ->
[{a, 3},
{b, <<"YE">>},
{c, case a == b of
true -> 7;
false -> "HELLO!!!"
end}].
Run Code Online (Sandbox Code Playgroud)
并完成了这件事.
if .. endErlang 的建筑通常不是你想要的.你想a == b在这种情况下仔细检查一个值,它可以产生两个输出之一true或false.在这种情况下,case表达式更直接.的if,如果你要检查多个不同的测试和挑选第一个匹配的,而我们只有一个测试,以这里为更好地利用.
我们像这样使用宏:
-define(IF(Cond,E1,E2), (case (Cond) of true -> (E1); false -> (E2) end)).
Run Code Online (Sandbox Code Playgroud)
然后在你的代码中你写:
io:format("~s~n", [?IF(a==b, "equal", "not equal")]).
Run Code Online (Sandbox Code Playgroud)
如果你问如何写出像表达式A == B ? X : Y那样的东西if,那就是
if
A == B ->
X;
true -> % "true" means "else" here
Y
end
Run Code Online (Sandbox Code Playgroud)
您也可以将其写为case表达式:
case A == B of
true ->
X;
_Else ->
Y
end
Run Code Online (Sandbox Code Playgroud)
要么
case A == B of
true ->
X;
false ->
Y
end
Run Code Online (Sandbox Code Playgroud)