Объяснение
Причина, по которой троичный оператор _ ? _ : _
существует во многих языках, связана с тем, что у них есть два синтаксических класса: операторы и выражения.Поскольку конструкции 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
уже работает.
Пример:
Предположим, мы должны вернуть простой проплист и у нас есть некоторые вычислениянам нужно сделать
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
, конструкция if .. end
в Эрланге обычно не то, что вы хотите.В этом случае вы хотите изучить значение a == b
, и оно может дать один из двух выходных данных true
или false
.В этом случае выражение case
является более прямым.if
лучше использовать, если вам нужно проверить несколько разных тестов и выбрать первое совпадение, тогда как у нас здесь есть только один тест.