Форма для if
:
if
<guard 1> -> <body1> ;
<guard 2> -> <body2> ;
...
end
Он работает, пытаясь защитить охранники в if-предложениях в порядке сверху вниз (это определено) до тех пор, пока не достигнет успешно завершенного теста, затем тело этого предложения оценивается и выражение if
возвращает значение последнего выражение в теле. Таким образом, бит else
на других языках запекается в нем. Если ни один из охранников не проходит успешно, выдается ошибка if_clause
. Обычный универсальный защитник - это просто true
, который всегда успешен, но универсальным может быть все, что верно.
Форма для case
:
case <expr> of
<pat 1> -> <body1> ;
<pat 2> -> <body2> ;
...
end
Он работает, сначала оценивая, а затем пытаясь сопоставить это значение с шаблонами в предложениях case в порядке убывания (это определено) до совпадения, а затем тело этого предложения
вычисляется и выражение case
возвращает значение последнего выражения в теле. Если шаблон не соответствует, генерируется ошибка case_clause
.
Обратите внимание, что if
и case
оба являются выражениями (все является выражением), поэтому они оба должны возвращать значения. Это одна из причин, по которой нет значения по умолчанию, если ничего не получается / не совпадает. Также, чтобы заставить вас охватить все варианты; это особенно важно для case
. if
- это просто вырожденный случай case
, поэтому он унаследовал его. Существует немного истории if
в Erlang Rationale, которую вы можете найти на trapexit.org в разделе вкладов пользователей.