如何在Erlang中写"a == b?X:Y"?

why*_*why 9 erlang

有没有一种在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对任意表达式XY.还要注意,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

if .. endErlang 的建筑通常不是你想要的.你想a == b在这种情况下仔细检查一个值,它可以产生两个输出之一truefalse.在这种情况下,case表达式更直接.的if,如果你要检查多个不同的测试和挑选第一个匹配的,而我们只有一个测试,以这里为更好地利用.


niv*_*ech 6

我们像这样使用宏:

-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)


Gab*_*abe 5

如果你问如何写出像表达式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)