有没有办法直接从Elixir中的元组返回一个值?

mra*_*lau 1 elixir

给定一个返回元组的函数,有没有办法从同一行的该元组中获取并返回特定值?我经常发现自己在Elixir中使用这种模式,并且想知道是否有一种实现相同结果的简便方法.

例如,我正在采摘并返回result以下函数:

def foo() do
  {:ok, result} = get_result()
  result
end
Run Code Online (Sandbox Code Playgroud)

有没有办法消除该方法中第二行代码的需要?

Dog*_*ert 7

您可以使用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)


Ale*_*kin 5

处理此问题的典型方法是使用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)