【问题标题】:Simpler way to take the first N elements from a tuple?从元组中获取前 N 个元素的更简单方法?
【发布时间】:2025-12-05 19:00:01
【问题描述】:

我有一个减少 3 元素元组列表的函数,但是当我完成后,我只需要返回前 2 个元素。这里的模式匹配看起来很笨拙。有没有更优雅的方式来获取前 N 个元素,比如 Enum.take/2 但对于一个元组?

  def navigate(steps) do
    {x, y, _} = Enum.reduce(steps, {0, 0, 0}, &Navigator.do_step/2)
    {x, y}
  end

【问题讨论】:

    标签: elixir


    【解决方案1】:

    没有开箱即用的这种方法,但可以使用then/2

    steps
    |> Enum.reduce({0, 0, 0}, &Navigator.do_step/2)
    |> then(fn {a, b, _} -> {a, b} end)
    

    另一种方式(我个人不喜欢它)是查看列表。

    steps
    |> Enum.reduce({0, 0, 0}, &Navigator.do_step/2)
    |> Tuple.to_list()
    |> Enum.take(2)
    |> List.to_tuple()
    

    另外,在你的情况下,你可以使用Tuple.delete_at/2

    steps
    |> Enum.reduce({0, 0, 0}, &Navigator.do_step/2)
    |> Tuple.delete_at(2)
    

    tuple_take/2 可能很容易实现为宏,顺便说一句:

    defmacro tuple_take({:{}, ctx, content}, count) do
      content = Enum.take(content, count)
      {:{}, ctx, content}
    end
    

    【讨论】:

      最近更新 更多