Elixir 列表还是元组?

2023-12-14 16:22 更新

列表和元组的区别是什么?

列表以连接表的形式在内存中存储,即列表中的每个元素包含了它的值和指向下一个元素的指针,直到列表的尽头。我们把每对值和指针称为一个驿站(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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号