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

Fle*_*ore 1 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)
Run Code Online (Sandbox Code Playgroud)

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

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

有什么替代方案吗?

Dog*_*ert 10

你应该使用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]
Run Code Online (Sandbox Code Playgroud)