【问题标题】:Simpler way to take the first N elements from a tuple?从元组中获取前 N 个元素的更简单方法?
【发布时间】:2021-12-04 00:30: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
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 2011-04-12
      • 2014-09-17
      • 2016-04-25
      • 2020-03-01
      • 2021-10-30
      • 2010-11-29
      相关资源
      最近更新 更多