[Редактировать]: я добавил удобную ссылку на отличный доклад, который охватывает эту концепцию, а также решения для более сложных задач из ElixirConf 2018 ниже.
Не делайтене беспокойся - Эликсир тебя прикрыл.Вы хотите, чтобы эта специальная форма : with/1
with/1
продолжала выполнять функции тогда и только тогда, когда они соответствуют ожидаемому результату.
Ваша основная функция выглядит примерно так:
def main_function(input) do
with {:ok, result_1} <- func1(input),
{:ok, result_2} <- func2(result_1),
...,
do: {:ok, EXPECTED_OUTCOME}
end
Когда не удается найти совпадение, скажем, потому что есть кортеж типа {:error, _error}
, специальная форма вернет первыйобнаружена ошибка и прекращено выполнение функций.
Вы также можете добавить условие else.В качестве примера, где я использовал это, пользователь может ожидать какое-то действие, требующее выполнения большого количества функций, и я хочу предупредить его об одном и том же, независимо от того, где оно не выполнено:
def main_function(input) do
with {:ok, result_1} <- func1(input),
{:ok, result_2} <- func2(result_1),
... do
{:ok, EXPECTED_OUTCOME}
else
_error ->
{:error, "Couldn't complete action"}
end
end
Дополнительные ресурсы:
Вот удивительный доклад автора Credo об этой концепции, любезно предоставленный ElixirConf 2018: https://www.youtube.com/watch?v=ycpNi701aCs&t=473s
Вот отличный пост на with/1
: https://www.erlang -solutions.com / блог / изучения-с-эликсир-специальный form.html