我有两个功能,我想运行step_1
,然后仅在step_2
正常时运行step_1
。什么是构建此代码的最功能惯用方式?嵌套case
语句看起来很难看但我不确定除了if
之外还有什么其他方法可以做到这一点甚至更糟。
defmodule Test do
def step_1 do
IO.puts "Step 1"
:error
end
def step_2 do
IO.puts "Step 2"
:ok
end
def do_something_case do
case step_1 do
:ok ->
case step_2 do
:ok -> {:ok}
:error -> {:error, :step_2}
end
:error -> {:error, :step_1}
end
end
def do_something_if do
r1 = step_1
if r1 == :ok
r2 = step_2
if r2 == :ok
:ok
else
{:error, :step_2}
end
else
{:error, :step_1}
end
end
end
答案 0 :(得分:8)
解决此问题的常用方法(没有monad库)是对函数的参数进行模式匹配并将它们组合在一起。
defmodule Test do
def step_1 do
IO.puts "Step 1"
:error
end
def step_2(:ok) do
IO.puts "Step 2"
:ok
end
def step_2({:error, _reason} = error) do
error
end
def do_something_pipeline do
step_1
|> step_2
end
end