在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_list
和to_tuple
函数将其转换回元组。但那太笨拙了。
答案 0 :(得分:24)
你无法连接元组。
唯一的原因是你不应该这样使用它们。大多数元组的使用需要知道它们的大小,如果你可以连接它们,事情会变得模糊。此外,连接元组需要在内存中复制两个元组,这是无效的。
换句话说,如果要连接元组,则可能是错误的数据结构。您有两种选择:
a ++ b
,只需撰写{a, b}
答案 1 :(得分:1)
@José Valim's answer(当然)是完全正确的,说你不能将元组与语言结构连接起来。 不应该把元组的大小变化。
然而,是一种生成由两个元组的值组成的元组的方法。 这不是你所谓的“直截了当”,因为它通过列表转换...... 但在某些情况下,特别是在使用遗留代码时,原始决策并不是最好的,它可以派上用场。
所以解决方案只是使用Tuple.to_list
和List.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}
请记住,这只是一种解决方法,可以修复已经破裂的情况。