给定一个返回元组的函数,有没有办法从同一行的该元组中获取并返回特定值?我经常发现自己在Elixir中使用这种模式,并且想知道是否有一种实现相同结果的简便方法.
例如,我正在采摘并返回result以下函数:
def foo() do
{:ok, result} = get_result()
result
end
Run Code Online (Sandbox Code Playgroud)
有没有办法消除该方法中第二行代码的需要?
您可以使用elem/2获取术语的第二项:
def foo() do
get_result() |> elem(1)
end
Run Code Online (Sandbox Code Playgroud)
但是这不会断言元组的第一个元素:ok就像你的原始代码一样.如果你想断言,你可以定义和重用一个简单的函数:
def foo do
get_result() |> extract()
end
def extract({:ok, term}), do: term
def extract(_), do: :error # raise an error here if you want
Run Code Online (Sandbox Code Playgroud)
处理此问题的典型方法是使用Kernel.SpecialForms.with/1:
def foo(), do: with {:ok, result} <- get_result(), do: result
Run Code Online (Sandbox Code Playgroud)
这种方法除了简洁简洁外,还具有许多优点。它会传播:error(以及任何不匹配{:ok, _})通过,使得错误处理魅力。
是否要丢弃任何非正常输入并返回just :error,请使用else带有with以下内容的子句:
def foo(), do: with {:ok, result} <- get_result(), do: result, else: (_ -> :error)
Run Code Online (Sandbox Code Playgroud)
要模仿初始代码的确切行为(提高MatchError不正常):
def foo(), do: with {:ok, result} <- get_result(), do: result, else: (42 = :error)
Run Code Online (Sandbox Code Playgroud)