Не существует идиоматического c способа передачи второго аргумента.
эликсир препятствует использованию труб в двух случаях:
- в цепочке только два звена
- следующая функция в цепочке принимает результат предыдущей функции, а не первый аргумент, или результат обеспечивает нечто отличное от того, что ожидает следующая функция в цепочке.
Всякий раз, когда это имеет смысл, базовая библиотека делает все возможное, чтобы предоставить все необходимое для придания шарма обаянию. Рассмотрим настройки строк. У нас есть две replace/4
функции: String.replace/4
и Regex.replace/4
с почти схожей функциональностью, но первая принимает строку в качестве первого аргумента для создания когда приходит строка, проще разбить ее на цепочки, и последняя принимает регулярное выражение в качестве первого аргумента.
Если вы не уверены в том, как транслировать - это явный признак того, что вы не должны транслировать. Этот простой язык сам по себе намекает на лучший способ go. Действительно, никто не возвращает {:ok, value}
из функции, которая всегда выполняется успешно. Тем не менее, может быть какой-то другой результат . В случае, о котором идет речь, {:error, reason}
. Дай угадаю: ты не хочешь, чтобы твой код взорвался. И эликсир любезно напоминает вам об этом. Конечно, вы все еще можете использовать Kernel.elem/2
, но вы действительно хотите? Бьюсь об заклад, нет.
Существует как минимум два разных подхода, в зависимости от того, чего вы на самом деле хотите достичь.
Один из них - использовать монади c SpecialForms.with/1
, который либо продолжает выполнять пункты , либо возвращает первый несопоставленный результат.
with {:ok, a} <- Mod.fun1(),
{:ok, b} <- Mod.fun2(a),
{:ok, c} <- Mod.fun3(b),
do: IO.puts(c)
Таким образом, вы либо выводите c
или return первый несопоставленный (читай: ошибочный) результат.
Другой способ - использовать Kernel.SpecialForms.case/2
.
File.cwd()
|> case do
{:ok, result} -> result
{:error, reason} -> LOG_OR_SOMETHING
end
Выберите любой из ваших вариантов , но помните: труба должна использоваться там, где она есть, а не везде.