【问题标题】:Concatenate tuples in elixir在长生不老药中连接元组
【发布时间】:2018-04-13 08:35:29
【问题描述】:

在 elixir 中,我们可以像这样连接列表

 ex(52)> [1,2,3,4] ++ [5,6,7]
 [1, 2, 3, 4, 5, 6, 7]

我们也可以连接元组吗?像这样?

iex(53)> {1,2,3,4} ++ {5,6,7}
 ** (ArgumentError) argument error
    :erlang.++({1, 2, 3, 4}, {5, 6, 7})

我能想到的唯一另一件事是将元组转换为列表,然后使用to_listto_tuple 函数转换回元组。但这太笨拙了。

【问题讨论】:

    标签: elixir


    【解决方案1】:

    你不能连接元组。

    唯一的原因是您不应该这样使用它们。大多数元组的使用都需要知道它们的大小,如果你可以将它们连接起来,事情就会变得更加模糊。此外,连接元组需要在内存中复制两个元组,效率不高。

    换句话说,如果你想连接元组,你可能有错误的数据结构。你有两个选择:

    1. 使用列表
    2. 组成元组:不用a ++ b,只写{a, b}

    【讨论】:

    • 如果我有 2 个元组的情况,我想将它们连接在一起,我应该怎么做?我是否必须将元组转换为列表,然后连接,然后将其转换回元组?
    • 我喜欢语言设计师回答问题。没有比这更正式的了。
    • 这很脏,但作为一种解决方法,可以使用Tuple.to_listList.to_tuple,利用列表连接的优势。我刚刚发布了这个作为答案。
    【解决方案2】:

    @José Valim's answer(当然)完全正确,说你不能用语言结构连接元组。 元组的大小不应该变化。

    但是,一种方法来生成由两个元组的值组成的元组。 这不是你所说的“直截了​​当”,因为它经过列表转换...... 但在某些情况下,尤其是在处理原始决策不是最好的遗留代码时,它会派上用场。

    所以解决方法就是使用Tuple.to_listList.to_tuple,比如这个演示函数:

    def concat_tuples(t1, t2) do
        List.to_tuple(
            Tuple.to_list(t1) ++ Tuple.to_list(t2)
        )
    end
    

    使用示例:

    iex> concat_tuples({1, 2}, {3, 4})
    {1, 2, 3, 4}
    

    请记住,这只是一种解决方法,用于修复已经损坏的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多