【IT168 技术文档】元组将各种元素组合在一起,我们同样也希望能够表示一串某些东西。列表在Erlang中就是被“[”和“]”包围起来的部分。下面就是一个关于城市和对应气温的列表的例子:
[{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]
注意到这个列表很长,以致于一行不能显示完,这没有关系,Erlang允许在非敏感的地方换行,但是在一个常量中或者整数中换行就是不允许的。
一个非常有用的寻找列表中一部分的方法就是使用“|”。在下面的shell中的例子可以很好的进行说明:
18> [First |TheRest] = [1,2,3,4,5]. [1,2,3,4,5] 19> First. 1 20> TheRest. [2,3,4,5]
我们使用“|”来分开第一个列表元素与后面剩下的元素。(First可以用来获取到值“1”,而TheRest可以获取到剩下的部分[2,3,4,5])。
另外一个例子:
21> [E1, E2 | R] = [1,2,3,4,5,6,7]. [1,2,3,4,5,6,7] 22> E1. 1 23> E2. 2 24> R. [3,4,5,6,7]
从上面我们可以看到使用“|”可以从列表中分离最开始的两个元素。当然,如果我们尝试获取比列表中包含的元素数量更多的元素,我们只会得到一个错误提示。但是有一个特殊情况就是获得一个没有包含任何元素的空列表[]。
25> [A, B | C] = [1, 2]. [1,2] 26> A. 1 27> B. 2 28> C. []
从上面所有的例子中,我们使用了新的变量名,而没有使用已经用过的那些:First、TheRest、E1、E2、R、A、B、C。原因在于在上下文相关的地方(同一个作用域),我们的变量只能赋值一次。我们稍后会回到这里,它并不想听上去那么奇怪。
下面的例子展示了我们如何得到一个列表的长度:
-module(tut4).
![]()
-export([list_length/1]).
![]()
list_length([]) ->
![]()
0;
![]()
list_length([First | Rest]) ->
![]()
1 + list_length(Rest).
编译文件“tut4.erl”并且运行一下:
29> c(tut4).
{ok,tut4}
30> tut4:list_length([1,2,3,4,5,6,7]).
7
解释下面的语句:
list_length([]) ->
0;
表明了空列表的长度被我们定义为0。
list_length([First | Rest]) ->
1 + list_length(Rest).
上面的代码表明一个非空列表的长度是第一个元素First加上后面剩下的Rest部分的长度的和。
(对于高级一点的读者:这里并非只能使用递归的方式,也有一些更好的方式来实现哈。)
一般情况下我们可以在我们在其他语言中使用“记录records”或者“结构structs”的地方说我们使用了列表,特别是我们试图表现一些可变大小的数据时。(就如同我们在其他语言中使用链表一样)
Erlang没有一个字符串数据类型,取而代之的是使用ASCII表示的列表。所以列表[97,98,99]等效为字符串“abc”。Erlang Shell是一个聪明的系统,可以猜出我们的列表到底想要表达什么样的数据,并且以合适的方式进行输出,这在大多数场合都是适用的。例如:
31> [97,98,99].
"abc"
