代码之家  ›  专栏  ›  技术社区  ›  intentionally-left-nil

提取管道中元组的第二个元素

  •  6
  • intentionally-left-nil  · 技术社区  · 6 年前

    我希望能够在管道中提取元组的第n个项,而不使用 with 或者破坏管道。 Enum.at 除了元组不是枚举这一事实外,它的工作完全正常。

    下面是一个激励人心的例子:

    colors = %{red: 1, green: 2, blue: 3}
    data = [:red, :red, :blue]
    data 
    |> Enum.map(&Map.fetch(colors, &1))
    |> Enum.unzip
    

    这个返回 {[:ok, :ok, :ok], [1, 1, 3]} 假设我只想提取 [1, 1, 3]

    (对于这个特定的案例,我可以使用 fetch! 但我的代码不存在。)

    我可以加上

    |> Tuple.to_list
    |> Enum.at(1)
    

    有没有更好的方法可以做到这一点,而不需要从每个元组中创建临时列表?

    2 回复  |  直到 6 年前
        1
  •  17
  •   Dogbert    6 年前

    使用 Kernel.elem/2 :

    iex(1)> {[:ok, :ok, :ok], [1, 1, 3]} |> elem(1)
    [1, 1, 3]
    
        2
  •  0
  •   Dinesh Balasubramanian    6 年前

    模式匹配 可以帮助

    { _status, required_value } = 
      data 
        |> Enum.map(&Map.fetch(colors, &1))
        |> Enum.unzip
    

    你可以忽略 _status .