从元组中获取前 N 个元素的更简单方法?

Simpler way to take the first N elements from a tuple?

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

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

没有现成的方法,但可以使用 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