我试图把握之间的差异列表和元组在Elixir.从Elixir指南的基本类型部分,我理解:
好的,这一切都很好,但我仍然不确定什么时候使用.我看到大多数方法返回一个元组但是其他地方都使用了Lists,并且许多方法接受Lists作为输入,而不是元组.根据上面提到的要点,不应该使用元组来传递数据,因为从用户给定值的元组中读取会很快吗?
我也注意到元组不是可枚举的,那是什么呢?不会使用Enum它们比在列表中使用它更快吗?
如果有人可以帮助我更好地理解它们,可能通过举几个例子说明什么时候使用,那就太棒了.
Paw*_*rok 38
你已经给出了很好的差异总结,所以在其中一个重要的条件下,它应该可以帮助你决定使用哪个.
考虑它的方法是列表是开放式数据结构,它们的大小可以在运行时变化,而元组在编译时设置一个恒定的大小.
例如,如果您想存储用户在iex会话期间提供的所有命令,您需要一个列表 - 该列表的长度将取决于该会话中给出的命令数.将其与元组的典型用例 - 返回{:ok, result}或{:error, reason}从方法 - 进行对比- 这里元素的数量是预先知道的,因此您不会为元组的性能改进支付不可接受的代价.
至于枚举 - 元组在概念上不是集合,每个元素的位置也应该表示它的作用.考虑一个{:ok, #PID<0.336.0>}元组 - 迭代它会先给你一个:ok然后一个#PID<0.336.0>,编写一个以统一的方式对这些东西起作用的函数会很奇怪.
Ono*_*cci 20
我不是专家,但这是我的理解:
在引擎盖下,列表是一个链表.因此它具有链表的性能特征.也就是说,获取长度是O(n)因为我必须遍历整个列表.同样,列表也具有链表的优点; 也就是说,通过添加到前面来增加它很容易.
我不确定幕后是什么元组,但我知道它不是一个链表.有人问到2013年在Elixir语言邮件列表上列举了元组,这是响应的一部分:
"元组也不应该被迭代,不要因为你可以使用elem/2和size/1而感到困惑.元组用于将多条信息存储在一起,这并不意味着它们是预期的用于存储集合."
- 彼得明顿
"另一种解释是,元组是穷人的记录.换句话说,元组代表单个数据,单个值,虽然是聚合.你不能在不改变特定元组的语义含义的情况下从元组中删除元素.值.
"这与存储许多值独立值的列表和其他集合相反.从列表中取一个值只会减少列表的长度.它不会影响任何事物的语义含义."
- 阿列克谢肖利克
换句话说,仅仅因为元组和列表之间存在肤浅的相似性,就不应该假设行为是相同的.