Подтвердить что ты не робот

Эрланг эквивалентен if else

У меня есть 2 части кода, которые я хочу выполнить. Оба являются условными выражениями

if Value1 < N do something 

else if Value1 >= N do something

if Value2 < N do something 

else if Value2 >= N do something

Я хочу, чтобы каждый оператор каждого выполнял.

Как работает if erlang? больше нет. Я использую несколько охранников, но похоже, что у меня есть утверждения 4 if. в группах по 2.

if some condition   
code;

if other condition  
code

end.

Я получаю синтаксическую ошибку.

4b9b3361

Ответ 1

Форма для if:

if
    <guard 1> -> <body1> ;
    <guard 2> -> <body2> ;
    ...
end

Он работает, пытаясь защититься в if-предложениях в порядке сверху вниз (это определено), пока не достигнет теста, который будет успешным, затем тело этого предложения будет оценено, а выражение if вернет значение последнего выражение в теле. Таким образом, бит else на других языках иссякает. Если ни один из охранников не удался, возникает ошибка if_clause. Обычный защитник всего лишь true, который всегда преуспевает, но все-таки может быть все, что истинно.

Форма для a case:

case <expr> of
    <pat 1> -> <body1> ;
    <pat 2> -> <body2> ;
    ...
end

Он работает, сначала оценивая, а затем пытаясь сопоставить это значение с шаблонами в case-clauses в порядке op-down (это определено) до тех пор, пока не будет выполнено одно совпадение, тогда тело этого предложения будет и выражение case возвращает значение последнего выражения в теле. Если шаблон не соответствует, генерируется ошибка case_clause.

Обратите внимание, что if и case - оба выражения (все это выражение), поэтому оба они должны возвращать значения. Это одна из причин, по которой значение по умолчанию отсутствует, если ничего не получается/соответствует. Также, чтобы заставить вас охватить все варианты; это особенно важно для case. if является просто вырожденным случаем case, поэтому он унаследовал его. В Erlang Rationale есть немного истории if, которую вы можете найти на trapexit.org в рамках пользовательских вкладов.

Ответ 2

Erlang не позволяет вам иметь if без опции true. Независимо от того, является ли это то, что является истинным утверждением или фактическим true зависит от вас, но обычно бывает, что ваш true является else на других языках.

if 
    some_condition -> some_code;
    some_other_condition -> some_other_code;
    true -> else_code
end.

См. "Что есть?" раздел эта страница для получения дополнительной информации об этом.

Ответ 3

Прежде всего, я рекомендую вам привыкнуть использовать оператор case, потому что условия 'if' ограничены выражениями защиты:

case custom_call(A) of
  1 -> do1(A);
  2 -> do2(A)
end.

Существует еще один способ выполнить условное выполнение, кроме "if" и "case", который работает с R13:

  1> N =10.
  10
  2> ((N > 10) andalso more).      
  false
  3> ((N == 10) andalso equals).
  equals

Ответ 4

Помните if в Erlang есть возвращаемое значение, и это выражение. Это не то, что if как на C или Java.

Если вы хотите что-то сделать для значения, код должен быть примерно таким:

if
  % do something and get the value
  X >= Val -> Something;
  % for doing something otherwise and get the value
  true -> Else_than_the_Something 
end.

Подробнее см. раздел для выражения if Справочного руководства Erlang.