在elixir中迭代元组的更干净的方法

时间:2017-02-25 19:27:58

标签: elixir

我发现自己经常写这样的图案,我觉得这不太理想:

Enum.filter(my_list, fn e -> 
   case e do 
     {:ok, x} -> true
     {:error, y} -> false 
   end 
end)
|> Enum.map(fn e -> {:ok, something} = e; something end)

my_list由某个返回{:ok,x}或{:error,y}的函数创建的地方

当我想忽略错误时,我会这样做。

对我有任何其他选择吗?

1 个答案:

答案 0 :(得分:9)

为此,您应该使用for模式{:ok, term}for会自动忽略枚举中与模式不匹配的所有值,这有助于实现这一优雅解决方案:

iex(1)> my_list = [{:ok, 1}, {:error, 2}, {:ok, 3}, {:ok, 4}, {:error, 5}]
[ok: 1, error: 2, ok: 3, ok: 4, error: 5]
iex(2)> for {:ok, term} <- my_list, do: term
[1, 3, 4]