在长生不老药中连接元组

Concatenate tuples in 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 函数转换回元组。但这太笨拙了。

您不能连接元组。

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

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

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

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

但是, 有一种方法可以生成由两个元组的值组成的元组。 这不是你所说的 "straightforward",因为它经过了列表转换...... 但在某些情况下,尤其是在处理原始决策并非最佳的遗留代码时,它会派上用场。

所以解决方案就是使用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}

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