列表与元组 - 使用什么以及何时使用?

She*_*yar 50 elixir

我试图把握之间的差异列表元组Elixir.从Elixir指南的基本类型部分,我理解:

  • 列表存储为链接项
  • 更新列表很快(仅在预先添加时)
  • 获取列表项很慢
  • 获取列表信息(大小/长度)很慢
  • 元组元素存储在一起
  • 获取元组信息很快
  • 获取元组元素很快
  • 修改元组很昂贵

好的,这一切都很好,但我仍然不确定什么时候使用.我看到大多数方法返回一个元组但是其他地方都使用了Lists,并且许多方法接受Lists作为输入,而不是元组.根据上面提到的要点,不应该使用元组来传递数据,因为从用户给定值的元组中读取会很快吗?

我也注意到元组不是可枚举的,那是什么呢?不会使用Enum它们比在列表中使用它更快吗?

如果有人可以帮助我更好地理解它们,可能通过举几个例子说明什么时候使用,那就太棒了.

Paw*_*rok 38

你已经给出了很好的差异总结,所以在其中一个重要的条件下,它应该可以帮助你决定使用哪个.

考虑它的方法是列表是开放式数据结构,它们的大小可以在运行时变化,而元组在编译时设置一个恒定的大小.

例如,如果您想存储用户在iex会话期间提供的所有命令,您需要一个列表 - 该列表的长度将取决于该会话中给出的命令数.将其与元组的典型用例 - 返回{:ok, result}{:error, reason}从方法 - 进行对比- 这里元素的数量是预先知道的,因此您不会为元组的性能改进支付不可接受的代价.

至于枚举 - 元组在概念上不是集合,每个元素的位置也应该表示它的作用.考虑一个{:ok, #PID<0.336.0>}元组 - 迭代它会先给你一个:ok然后一个#PID<0.336.0>,编写一个以统一的方式对这些东西起作用的函数会很奇怪.

  • 所以,如果我正确地进行了迭代,那么列表是正常的(这对我来说听起来完全合乎逻辑)并且迭代元组是非常奇怪的?我可以看到迭代一个元组可能没有任何意义. (3认同)
  • 是啊.如果由于某种原因你绝对必须迭代一个元组,你可以尝试`Tuple.to_list` (3认同)

Ono*_*cci 20

我不是专家,但这是我的理解:

在引擎盖下,列表是一个链表.因此它具有链表的性能特征.也就是说,获取长度是O(n)因为我必须遍历整个列表.同样,列表也具有链表的优点; 也就是说,通过添加到前面来增加它很容易.

我不确定幕后是什么元组,但我知道它不是一个链表.有人问到2013年在Elixir语言邮件列表上列举了元组,这是响应的一部分:

"元组也不应该被迭代,不要因为你可以使用elem/2和size/1而感到困惑.元组用于将多条信息存储在一起,这并不意味着它们是预期的用于存储集合."

- 彼得明顿

"另一种解释是,元组是穷人的记录.换句话说,元组代表单个数据,单个值,虽然是聚合.你不能在不改变特定元组的语义含义的情况下从元组中删除元素.值.

"这与存储许多值独立值的列表和其他集合相反.从列表中取一个值只会减少列表的长度.它不会影响任何事物的语义含义."

- 阿列克谢肖利克

换句话说,仅仅因为元组和列表之间存在肤浅的相似性,就不应该假设行为是相同的.


小智 13

除了已经说过的内容之外,帮助我区分元组和列表的内容类似于数据库中的一行.如果您以这种方式考虑元组,很容易看出元组中的信息如何相互关联,并且很明显为什么您不将它用作Enumerable.