Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法直接从Elixir中的元组返回值?_Elixir - Fatal编程技术网

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

有没有办法直接从Elixir中的元组返回值?,elixir,Elixir,给定一个返回元组的函数,有没有办法在同一行从该元组中提取并返回特定值?我经常发现自己在长生不老药中使用这种模式,我想知道是否有一种速记方法可以达到同样的效果 例如,我在下面的函数中拾取并返回result: def foo() do {:ok, result} = get_result() result end 有没有办法在该方法中不需要第二行代码?您可以使用elem/2获取术语的第二项: def foo() do get_result() |> elem(1) end 但这

给定一个返回元组的函数,有没有办法在同一行从该元组中提取并返回特定值?我经常发现自己在长生不老药中使用这种模式,我想知道是否有一种速记方法可以达到同样的效果

例如,我在下面的函数中拾取并返回
result

def foo() do
  {:ok, result} = get_result()
  result
end

有没有办法在该方法中不需要第二行代码?

您可以使用
elem/2
获取术语的第二项:

def foo() do
  get_result() |> elem(1)
end
但这不会像原始代码那样断言元组的第一个元素是
: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

您可以使用
elem/2
获取术语的第二项:

def foo() do
  get_result() |> elem(1)
end
但这不会像原始代码那样断言元组的第一个元素是
: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
您可以在一行中对其进行编码:
关于此处使用的几种语法糖的更多详细信息:
  • 在中编写函数
  • 将第一个函数的结果流到第二个函数的第一个参数中:
    fun1()|>fun2()
  • 使用以下语法创建具有一个参数的匿名函数:
    (&()).()
  • 模拟三元条件:

    A&&B|C
    if A do B else C end

这是一种用长生不老药编码高尔夫的奇特方式。但是,您会失去可读性。

您可以在一行代码中对其进行编码:
关于此处使用的几种语法糖的更多详细信息:
  • 在中编写函数
  • 将第一个函数的结果流到第二个函数的第一个参数中:
    fun1()|>fun2()
  • 使用以下语法创建具有一个参数的匿名函数:
    (&()).()
  • 模拟三元条件:

    A&&B|C
    if A do B else C end


这是一种用长生不老药编码高尔夫的奇特方式。但是,您会失去可读性。

处理此问题的典型方法是使用:


def foo(),do:with{:ok,result}处理此问题的典型方法是使用:


def foo(),do:with{:ok,result}一行完全相同的操作可能不会那么难看:
def foo(),do:with{:ok,result}:error)
。您向我展示了一个更好的解决方案。然而,我喜欢这样一个事实,即有一种黑客可以将数据流传输到匿名函数中。Oneliner做完全相同的事情可能不会那么难看:
def foo(),do:with{:ok,result}:error)
。您向我展示了一个更好的解决方案。然而,我喜欢这样一个事实,即有一种黑客可以将流传输到匿名函数中。