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

Когда должна возвращаться функция Erlang?

Я часто вижу, что функции Erlang возвращают ok, или {ok, <some value>}, или {error, <some problem>}.

Предположим, что моя функция возвращает целое число N. Если моя функция возвращает только N или {ok, N}?

Или предположим, что моя функция включает вызов io:function("Yada yada"). Должен ли он возвращать ok или вообще ничего?

Или предположим, что я делаю запись или забаву. Должен ли я возвращать {ok, R} или (ok, F}?

Спасибо,

LRP

4b9b3361

Ответ 1

Это вопрос стиля, но разумный выбор имеет большое значение для того, чтобы сделать ваш код более читабельным и поддерживаемым. Вот некоторые мысли, основанные на моих собственных предпочтениях и то, что я вижу в стандартной библиотеке:

  • Если функция может вернуться как с успехом, так и с возможностью восстановления, вам может потребоваться, чтобы случай успеха выглядел как {ok, _} или ok. Хорошие примеры: orddict:find/2 и application:start/1. Мы делаем это, так что оба случая могут быть легко сопоставлены с образцом при совершении вызова.
  • Если функция имеет только успешный случай со значимым результатом, то просто верните результат, так как нет необходимости добавлять дополнительную информацию. Фактически, если вы должны обернуть результат в кортеж, тогда вы не можете легко объединить вызовы, например. foo(bar(N)) может не работать, если bar/1 возвращает {ok, _}. Хорошие примеры: lists:nth/2 и math:cos/1.
  • Если функция имеет только успешный случай без значимого результата, общая идиома должна возвращать ok или true, в отличие от последнего возвращаемого значения в функции. Хорошие примеры: ets:delete/1 и io:format/1.

Ответ 2

Предположим, что моя функция возвращает целое число N. Если моя функция возвращает только N или {ok, N}?

Если вообще отсутствует какая-либо ошибка, или любая ошибка указывает на ошибку программирования, N. Если есть серьезные основания для отказа, верните {ok, N}{error, Reason} в случае сбоя).

Должен ли он нормально или вообще ничего не показывать?

В Эрланге вы ничего не можете вернуть. Если у вас нет значимого возвращаемого значения, ok будет работать нормально.

Ответ 3

Это загадка, которую я нахожу во многих случаях. Правило большого пальца (по крайней мере, мой большой палец) состоит в том, что если функция должна использоваться в основном с другими функциями (такими функциями более высокого порядка, как map(), filter() и т.д.), Или если функция предназначена для "чисто", (без побочных эффектов), тогда я бы предпочел НЕ возвращать {ok, _} и просто возвращать результат. Ошибки в этом случае должны быть вызваны некоторой логической/алгоритмической ошибкой, которая должна быть исправлена, и клиент функции должен быть осведомлен о любой такой ошибке.