技术开发 频道

Erlang编程入门之列表

  【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"

0
相关文章