首页 > Erlang快速入门 > 3.6 Erlang快速入门之列表
2013
11-01

3.6 Erlang快速入门之列表

BACK TOP文章索引

  1. Erlang 列表定义
  2. Erlang “|”的使用
  3. 共1条评论

Erlang 列表定义

本章节将讲述关于Erlang列表的知识:
元组把事件聚合在一起,同样的我们也希望把事件连接在一起。在Erlang里列表被”["和"]“所包围。例如在全国各地的温度列表可以用如下方法表示:
[{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}},
{paris, {f, 28}}, {london, {f, 36}}]

故:我们称被”[","]“所包围的一组事物为列表.。或定义为: 将不定数量的项组在一起,再加上[]括号,就形成了列表。列表的每一项可以是元组,也可以仍是列表,即列表是可以允许嵌套使用的。(查看元组和列表的区别
注意这个列表的长度已经超出了一行,不过没有关系,在Erlang里是允许代码在非“敏感”的地方进行换行的,例如在常量和整数等是不允许换行的。

Erlang “|”的使用

用“|”是一个非常的用于查看列表中的部分元素。我们用shell举一个例子来解释:

4> [First |TheRest] = [1,2,3,4,5].
[1,2,3,4,5]
5> First.
1
6> TheRest.
[2,3,4,5]
7> 

我们使用”|”来把第一个元素和剩下的元素分离开来(First 的值为1,TheRest的值为[2,3,4,5]).
再来看一个例子:

7> [E1, E2 | R] = [1,2,3,4,5,6,7].
[1,2,3,4,5,6,7]
8> E1.
1
9> E2.
2
10> R.
[3,4,5,6,7]
11> 

从上面我们可以看到使用“|”可以从列表中分离最开始的两个元素。当然,如果我们尝试获取比列表中包含的元素数量更多的元素,我们只会得到一个错误提示。但是有一个特殊情况就是获得一个没有包含任何元素的空列表[]。

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部分的长度的和。
(对于高级一点的读者:这里并非只能使用递归的方式,也有一些更好的方式来实现哈,例如:使用foreach与map
一般情况下我们可以在我们在其他语言中使用“记录records”或者“结构structs”的地方说我们使用了列表,特别是我们试图表现一些可变大小的数据时。(就如同我们在其他语言中使用链表一样)
Erlang没有一个字符串数据类型,取而代之的是使用ASCII表示的列表。所以列表[97,98,99]等效为字符串“abc”。Erlang Shell是一个聪明的系统,可以猜出我们的列表到底想要表达什么样的数据,并且以合适的方式进行输出,这在大多数场合都是适用的。例如:

<code>31> [97,98,99].
"abc"</code>

3.6 Erlang快速入门之列表》有 1 条评论

  1. 路人甲 说:

    有我呢,暖

留下一个回复

你的email不会被公开。