Когда должна возвращаться функция Erlang?
Я часто вижу, что функции Erlang возвращают ok
, или {ok, <some value>}
, или {error, <some problem>}
.
Предположим, что моя функция возвращает целое число N. Если моя функция возвращает только N или {ok, N}
?
Или предположим, что моя функция включает вызов io:function("Yada yada")
. Должен ли он возвращать ok
или вообще ничего?
Или предположим, что я делаю запись или забаву. Должен ли я возвращать {ok, R}
или (ok, F}
?
Спасибо,
LRP
Ответы
Ответ 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, _} и просто возвращать результат. Ошибки в этом случае должны быть вызваны некоторой логической/алгоритмической ошибкой, которая должна быть исправлена, и клиент функции должен быть осведомлен о любой такой ошибке.