Erlang эквивалентно если еще - PullRequest
13 голосов
/ 01 декабря 2010

У меня есть 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 заявления.в группах 2.

if some condition   
code;

if other condition  
code

end.

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

Ответы [ 4 ]

22 голосов
/ 02 декабря 2010

Форма для 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 в разделе вкладов пользователей.

13 голосов
/ 01 декабря 2010

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

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

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

6 голосов
/ 11 декабря 2010

Помните, 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 для получения дополнительной информации.

5 голосов
/ 01 декабря 2010

Прежде всего, я рекомендую вам привыкнуть использовать оператор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...