Что предпочтительнее? Охрана или случай? - программирование
Подтвердить что ты не робот

Что предпочтительнее? Охрана или случай?

Стиль 1:

a(X) when X>1 -> 
    ...omitted;
a(X) when X ->
    ...omitted.

Стиль 2

a(X) ->
    case X>1 of
        true-> ...ommited;
        false-> ...ommited
    end.

==== Обновление ===

Как сказал @rviding, я обновляю сравнение следующим образом:

Стиль 1:

a(X) when X>1 -> 
    ...omitted;
a(X) ->
    ...omitted.

Стиль 2

a(X) ->
    case X>1 of
        true-> ...ommited;
        false-> ...ommited
    end.
4b9b3361

Ответ 1

Learn You. В разделе Erlang о синтаксисе функций говорится, что предложения функций и операторы case в основном одинаковы, за исключением одного различия: совпадение шаблонов в clauses может обрабатывать несколько шаблонов, тогда как оператор case может обрабатывать только один оператор.

Кроме того, я считаю, что это вопрос вкуса. Я склонен использовать разные функциональные предложения, когда случаи действительно различны (как в: полная функция будет вести себя по-другому), и я использую аргументы case, когда я хочу, чтобы код расходился и снова сливался, например. для вычисления значения переменной на основе выражения.

Edit Как указано RobertAloi в комментариях ниже, вы не ограничены при использовании case .. of. Кроме того, как пишет rvirding, компилятор делает некоторую оптимизацию при обертке разных выражений в кортеже, чтобы обеспечить сопоставление с ними.

Ответ 2

Вы также должны учитывать, что тестирование результата BIF не соответствует точному поведению в защите, чем внутри функции.

Я узнал об этом недавно, например, (length(L) > -1) падает внутри функции, но не находится в защитнике, когда L является неправильным списком.