Elixir 列表还是元组?
列表和元组的区别是什么?
列表以连接表的形式在内存中存储,即列表中的每个元素包含了它的值和指向下一个元素的指针,直到列表的尽头。我们把每对值和指针称为一个驿站(cons cell):
iex> list = [1 | [2 | [3 | []]]]
[1, 2, 3]
这意味着访问一个列表的长度是一个线性操作:我们需要贯穿整个列表来算出它的长度。更新一个列表只需要在它前面加上元素:
iex> [0 | list]
[0, 1, 2, 3]
而元组,是以连续的方式存储在内存中的。这意味着获得元组长度或通过坐标访问元素都很快。然而,更新或添加元素却很复杂,因为必须复制整个元组。
不同的性能特点决定了这些数据结构的用途。元组常用于返回函数的额外信息。例如,是一个用于读取文件内容的函数,它返回了一个元组:File.read/1
iex> File.read("path/to/existing/file")
{:ok, "... contents ..."}
iex> File.read("path/to/unknown/file")
{:error, :anoint}
如果提供给的路径存在,那么它返回了一个元组,由原子作为第一个元素,文件内容作为第二个。否则,返回的元组会包含和错误描述。File.read/1
:ok
:error
大多数时候,Elixir会引导你做正确的事。例如,函数可以访问元组,但是对于列表却没有定义相似的函数:elem/2
iex> tuple = {:ok, "hello"}
{:ok, "hello"}
iex> elem(tuple, 1)
"hello"
当"计算"一个数据结构中元素数量时,Elixir也制定了一条简单的规则:如果操作时间是固定的(例如,值是计算好的),则函数被命名为大小;若操作时间是线性的(例如,计算长度的时间随着输入的增长而变长),则函数被命名为长度。size
length
例如,我们已经学习了4个计量函数:(字符串中的字节数),(元组大小),(列表长度)以及(字符串中的字素数)。这说明,我们使用来获取字符串的字节数是廉价的,但用来得到字符串中unicode字符的数量就需要贯穿整个字符串。byte_size/1
tuple_size/1
length/1
String.length/1
byte_size
String.length
Elixir也提供了,和作为数据类型(通常用于进程通信),当讲到进程时我们会简单地介绍它们。现在,让我们看一些对于基本类型的基本操作。Port
Reference
PID
更多建议: