Elixir 列表
列表 是由多个数据组成的一个集合。有点像数组,但是内部不是像数组那样使用连续内存存储数据,而是使用链表来存储数据。
你是在分不清,那就和我刚开始的时候一样吧,死记硬背就好了。
Elixir 使用方括号 []
来指定一个值列表。值可以是任何类型。
iex(38)> [1,2,3] [1, 2, 3] iex(39)> [1,2.0,true,"hello",:world] [1, 2.0, true, "hello", :world]
你可能有疑惑,为啥一组数字里放了个 true
进去。对的,这里没有强制要求必须是同一种数据类型。 反正是东西都能往里面塞,人家唯一的要求就是 一对中括号。
列表的长度
Elixir 提供了 length/1
函数用于求取列表的长度,也就是获取列表元素的个数。
iex> length([1,2,3]) 3 iex> length([1,2.0,true,"hello",:world]) 5
拼接列表
Elixir 提供了 ++/2
运算符用于拼接两个列表,拼接的意思,就是把后面的列表的参数放到第一个列表尾部
iex> [1] ++ [2,3] [1, 2, 3] iex> [] ++ [2,3] [2, 3] iex> [2,3] ++ [] [2, 3] iex> [1,2,3] ++ [1,2,4] [1, 2, 3, 1, 2, 4]
减去列表
Elixir 提供了 --/2
运算符用于减去一个列表,也就是将第二个列表中的元素,一对一的消除第一个列表中的相同的元素。 如果第二个列表中某个元素在第一个列表中不存在,则忽略。
iex> [1,2,3] ++ [1,2,4] [1, 2, 3, 1, 2, 4] iex> [1,2,3] -- [4,5,6] [1, 2, 3] iex> [1,2,3] -- [3,3,3] [1, 2] iex> [1,2,2,3] -- [2] [1, 2, 3]
注意: 最后一个范例,一对一的意思,就是玩 连连看 消除一样。
列表不可变性
Exilir 基于 Erlang 而来,自然继承了 Erlang 的不可变性。 列表不可变的意思,就是 列表从定义那时起,就不能改变元素的内容,也不能改变列表的长度。
所以,列表操作符从来不改变现有列表,所有的操作符都是返回一个新的列表。
iex> a = [1,2,2,3] [1, 2, 2, 3] iex> b = [2] [2] iex> c = a -- b [1, 2, 3] iex> a [1, 2, 2, 3] iex> b [2] iex> c [1, 2, 3]
head 和 tail
接下来的教程中,我们会更详细的讨论列表相关的内容。尤其是 head 和 tail 的概念。
举个例子,对于列表 [1,2,2,3]
- head 是头是列表的第一个元素,在
[1,2,2,3]
范例中指的是1
这个元素 - tail 是尾部是列表的其余部分,在
[1,2,2,3]
范例中,指的是[2,2,3]
这个列表。
Elixir 提供了 hd/1
获取列表的 head
iex> hd([1,2,2,3]) 1
如果一个列表为空,则 hd/1
函数会引发错误。
iex> hd([]) ** (ArgumentError) errors were found at the given arguments: * 1st argument: not a nonempty list :erlang.hd([])
Elixir 还提供了 tl/1
函数用于返回一个列表的尾部
iex> tl([1,2,3]) [2, 3]
如果一个列表为空,则 td/1
函数会引发错误。
iex> tl([]) ** (ArgumentError) errors were found at the given arguments: * 1st argument: not a nonempty list :erlang.tl([])
单引号字符串
在前面的字符串教程里,我们尝试了 '简单教程'
这种单引号围起来的字符串,没想道返回下面的结果
iex> '简单教程' [31616, 21333, 25945, 31243]
有时你会创建一个列表,它将返回一个单引号的值
iex> [11, 12, 13] '\v\f\r' iex> [104, 101, 108, 108, 111] 'hello'
但如果你尝试下面这个,则又没发生
iex> [31616, 21333, 25945, 31243] [31616, 21333, 25945, 31243]
为什么会这样呢?
当 Elixir 看到可打印的 ASCII 码 列表时,Elixir 将把它打印为 charlist(字面上是一个字符列表)。
无论何时您在 iex 中看到一个值,并且你不确定它是什么,您都可以使用它 i/1
来检索有关它的信息
iex> i'简单教程' Term [31616, 21333, 25945, 31243] Data type List Reference modules List Implemented protocols Collectable, Enumerable, IEx.Info, Inspect, List.Chars, String.Chars
字符列表
请记住:Elixir 中的单引号和双引号表示不同,因为它们由不同类型表示
在 Elixir 中,单引号围起来的字符串是 字符串列表,双引号围起来的才是 字符串。
我们将会在后面的章节中详细介绍这种不同。