今天我要来学习一下Erlang中一个关键的数据类型----列表
列表是用[...]方括号来表示的,其元素类型和元组一样可以是任意类型,长度也是任意的。
先来看几个基本的简单的列表:
[1,2,3]
[one,two,three]
[[1,2,3],[one,two,three]]
[ {person,“Michael”,24,"male"},{person,"Tina",23,"female"}]
[ ] //空的,什么元素也没有
所以列表就是零个或者多个Erlang项式的序列。
添加列表元素:
有件事用元组无法简单高效地完成,用列表却可以,那就是以现有的列表为基础创建一个新的,更长的列表。用管道符 | 便可完成。
[ 1 | [ ] ] --> [ 1 ]//它将右侧的空表与左侧的元素1合并,得到列表[ 1 ]
[ 2 | [ 1 ] ] --> [ 2 , 1 ]//它将左侧的元素2取出合并到右侧的列表中去
[ 1,2,3 | [4,5]] --> [1,2,3,4,5]//同上,先添加3,再添加2,最后添加1
现在来仔细体会一下,| 管道符的左侧可以是任意数据,管道的右侧必须是一个列表,同时,管道符和左右数据要在一个列表中(被[ ]方括号包围)。
再多做几个实验:
[ 1 | 2 ] --> [1 | 2]
[ [1,2] | [3] ] --> [ [1,2],3]
[{one,two,three},[1,2] | [3]] --> [{one,two,three},[1,2],3]
[1 | ]. --> syntax error before: ']'
[ | ] --> syntax error before: '|'
[ | 2] --> syntax error before: '|'
[ | [2] ] --> syntax error before: '|'
[ [] | [2] ] --> [ [] ,2]
[ {} | [2] ] --> [ {} ,2]
尝试了这么多,几乎能想到的组合都想到了,由此得出了管道符号的使用规律:
- 管道符号的右边必须要有一个列表。不然你数据没有地方合并啊。
- 管道符号的左边必须要有占内存的项式。{}空元组,[]空列表其实是占内存的。
- 管道符号将左边的数据按照项式为单位一个个合并到右边的列表中去。1,2就是两个项式,[1,2]整体就是一个项式,等等。
在做一个实验:
A = [1,2].
B = [5,4,3 | A]. 此时B 为 [5,4,3,2,1]
再显示A 为[1,2]
即得到第四个规律:
4.管道符号右侧的列表不会被修改
同时再实验一下规律3:
A = [1,2].
B = [3,4].
C = [ A | B]. --> [[1,2],3,4] 验证了规律3是正确的。此时的A就是一个项式了。
++运算符号
除了使用管道符号来实现添加列表元素功能外,还可以使用++运算符。
这样使用:
[1,2,3] ++ [4,5] --> [1,2,3,4,5]
使用方法基本和管道符号相似。区别就是
管道符左侧的数据被分离出去用[ ]方括号包围住了:[1,2,{one} | [3]] ------->[1,2,{one}] ++ [3,4]
列出参考资料:
《Erlang/OTP并发编程实战》第二章