在elixir中连接元组

时间:2015-02-05 22:04:39

标签: elixir

在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函数将其转换回元组。但那太笨拙了。

2 个答案:

答案 0 :(得分:24)

你无法连接元组。

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

换句话说,如果要连接元组,则可能是错误的数据结构。您有两种选择:

  1. 使用列表
  2. 撰写元组:而不是a ++ b,只需撰写{a, b}
  3. 即可

答案 1 :(得分:1)

@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}

请记住,这只是一种解决方法,可以修复已经破裂的情况。