传送门:http://blog.chinaunix.net/space.php?uid=22566367&do=blog&id=1993490
在erlang程序设计中,元组与列表本人很容易混淆,不知道什么时候应该使用元组,什么时候应该使用列表,为此,我查阅了一些网上的资料,并添加了一些
自己的理解,如果有理解不到位的地方,欢迎大家指正。
元组:
将一定数量项组成在一起,就形成了一个单一的实体,并且若干个项之间使用逗号隔开,形成的整个实体使用{}括起来,这样就形成了一个元组。这个元组的概念有点像c语言中的结构体,因为在erlang程序中并没有结构体这个概念,因此为了描述一个实体多方面的属性值的时候就引用了这个概念,我们可以把这个元组的概念和c语言中的结构体概念对比着理解。另外,一旦元组创建之后,元组项的个数就不能再变化了。其实元组就是原子。
例如,我们要描述一台电脑的时候可以这么来描述:
{sunny_computer, {name, asus}, {memory, 2048}, {disk, 300}}
细心的人可能发现,在这个元组当中我又一次嵌套了元组,是的,元组是可以嵌套的。
总结一下:元组也是一个原子。
列表:
将不定数量的项组在一起,再加上[]括号,就形成了列表。列表的每一项可以是元组,也可以仍是列表,即列表是可以允许嵌套使用的。
和元组的主要区别是列表是存储可变数目的东西,创建一个列表之后,我们仍然可以往其中增加项,当然可以删除项,因此列表使用的话比较灵活一些。
例如,我们要描述张三买了一台电脑,李四买了一件新衣服:
[{zhangsan, computer}, {lisi, clothes}]
接着李四卖掉新衣服,买了一个外星人,王五买了拖拉机,准备当农民,这样的话,列表就变成了这样的:
[{zhangsan, computer}, {lisi, ET}, {wangwu, tractor}]
由此我们可以看出,列表中的项的个数是可以变化的,数目不定。
元组与列表对比:
(1)从创建的角度来说。
在声明元组的时候,就自动创建了一个元组。
而对于列表来说,创建一个列表有两种方式,一种是直接定义,例如:F=[abc];另外一种是在已经创建的基础上再次添加一个项,那新构成的这个仍然是列表。
(2)从提取的角度来说。
从元组中提取字段值的时候,我们一般使用的是“=”来提取,而对于列表来说,使用的仍然还是模式匹配,只不过对于列表来说的话,我们每一次只能提取这个列表的头部,也就说一次只能提取一个项。
例如,对于元组提取元素的使用如下:
1> A={apple, orange, bag, love}.
{apple,orange,bag,love}
2> {B, C, _, _} = A.
{apple,orange,bag,love}
3> B.
apple
4> C.
orange
对于列表的提取例子如下:
12> f().
ok
13> A=[fanying].
[fanying]
14> B=[yingfei|A].
[yingfei,fanying]
15> C=[flying|B].
[flying,yingfei,fanying]
16> [F|M]=C.
[flying,yingfei,fanying]
17> F.
flying
18> M.
[yingfei,fanying]
19>
每一次“[Head|End]=F.”中,Head提取出来的是一个元素,而End提取出来的是还是一个列表。
这里我们还有一个需要注意的地方,在我们写erlang程序的时候,通常的返回值如果是元组的话,我们使用一个变量进行匹配是可以的。例如:
^_^[sunny@sunny-laptop ~/erl_test]2$ cat fan.erl
-module(fan).
-export([test/0]).
test() ->
case fun_test() of
false ->
io:format("Result is error!~n");
{Result} ->
io:format("Result is ~p~n", [Result])
end.
fun_test() ->
{fanying}. %%{fanying, yingfei, fei} 这个返回值上面的匹配是有问题的
^_^[sunny@sunny-laptop ~/erl_test]3$
在fun_test()函数中返回一个元组,这个元组在test()函数中使用一个变量进行匹配是可以的。当我们把fun_test()的返回值的元组的元素个数改为不止一个的时候,就会出现问题,因此一般我们再返回值列表的元素个数不确定的情况下,我们最好使用一个变量(去掉{}的方式来接收)来进行接收,而不是一个带有{Result}的方式进行接收。
我们将上面的fun_test()函数返回的那个元组如果改为一个列表,结果会怎样呢?我们继续往下看:
^_^[sunny@sunny-laptop ~/erl_test]3$ cat fan.erl
-module(fan).
-export([test/0]).
test() ->
case fun_test() of
false ->
io:format("Result is error!~n");
[Result] ->
io:format("Result is ~p~n", [Result])
end.
fun_test() ->
[fanying]. %%[fanying, yingfei, fei] 这个返回值上面的匹配是有问题的
^_^[sunny@sunny-laptop ~/erl_test]4$
在fun_test()函数中返回了一个只有一个元素的列表,这个时候我们使用[Result]的形式进行匹配是正确的,但是如果我们将这个返回值改为[fanying, yingfei, fei]式的时候,就会出现问题。因此,如果返回值是一个列表,这个时候我们进行匹配的时候,最好使用变量来进行匹配,使用列表的“提取元素”方式进行元素的提取。
对于这个问题我们在erlang编程的时候要切记,当初我就是由于疏忽了这一点,花费了很长的时间最后才找到了这个错误。
小结:
个人理解,仅供参考:元组相当于定长的数组,而列表相当于不定长的链表。
分享到:
相关推荐
- **1.3.1 进程**:Erlang的进程与其他语言中的线程类似,但它们是轻量级的,并且通过消息传递进行通信。 - **1.3.2 信息传递**:进程间通信是通过消息传递完成的,Erlang提供了简单的机制来实现这一点。 - **1.3.3 ...
在Erlang中,处理大数据存储有多种方式,其中包括ETS(Erlang Term Storage)、DETS(Distributed Erlang Term Storage)、Mnesia以及MySQL等。下面将对这些存储方式进行详细解析。 1. ETS(Erlang Term Storage) ...
5. **处理结果**:Erlang驱动将MySQL的查询结果转换为Erlang的数据结构,如列表或元组,以便于进一步处理。你需要遍历这些结果并根据需要进行操作。 6. **事务处理**:如果需要确保一组SQL操作的原子性,可以使用...
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
"Erlang中文基础教程" Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了一个交互式的 shell 环境,允许用户在其中编写和运行代码。 Erlang Shell 是一个命令行交互环境,类似于 UNIX 和 LINUX 系统的...
通过分析`ets_test.erl`源码,我们可以深入理解Erlang中的Record是如何与ETS结合使用的,以及如何在实践中提高代码效率和可维护性。不过,由于具体源码未给出,这部分只能进行推测,实际的内容还需要查看源码文件...
Erlang有丰富的内置数据类型,如整数、浮点数、字符串、原子(Atom)、列表和元组等。虽然Erlang是动态类型的,但可以通过类型注解进行类型检查,提高代码的健壮性。 ### 7. 模块与函数 Erlang的代码组织在模块中...
1. **Erlang语法**:涵盖基本的变量、数据类型(如原子、列表、元组和二进制)、控制结构(如case表达式和if语句)以及函数定义。 2. **函数式编程概念**:Erlang是纯函数式语言,书中可能会介绍函数式编程的基本...
与列表类似,Erlang也提供了用于处理元组的内置函数。这些函数包括`element`(获取元组中的某个元素)、`size`(获取元组大小)等。 **4.2 多个返回值** 元组的一个重要应用是在函数中返回多个值。这比使用列表或...
- **Erlang的数据类型**:包括原子(atom)、整数、浮点数、字符串、列表、元组、位串等。 - **Pattern Matching**:Erlang的匹配操作符`=`允许在函数调用、case语句和receive语句中进行模式匹配。 熟悉这些概念和...
Erlang还提供了多种常用数据结构,比如元组、列表、字典、集合等,这些数据结构是构建复杂数据类型的基础。 并行编程是Erlang的一大亮点,它允许开发者使用轻量级的进程来执行并行操作,每个进程都是独立的,并拥有...
### Erlang 中文基础教程:理解Erlang Shell与模块函数 #### 1. Erlang Shell:编程者的交互式环境 Erlang Shell是Erlang编程语言提供的一种交互式编程环境,允许开发者直接在命令行中编写、执行Erlang代码并观察...
- **基本操作**:包括启动交互式shell,进行简单的整数和浮点数运算,使用变量、原子、元组、列表等。 - **模式匹配**:Erlang中的一个重要特性是模式匹配,它允许开发者将数据结构中的信息提取出来。 - **模块化...
Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程崩溃时得到通知。链接用于追踪相关进程的状态,而监控则可以观察进程的生存状态。 ### 5. 消息传递 Erlang的进程间通信主要...
函数式编程强调不可变数据,因此Erlang中的数据结构如列表、元组和映射都是不可变的。 Erlang的并发模型基于进程,每个进程拥有独立的内存空间,它们通过消息进行通信。这种设计允许进程在出现错误时不会影响到其他...
**Erlang程序设计与入门** Erlang是一种并发、函数式编程语言,主要用于构建分布式、高可用性、容错性强的系统。它的设计灵感来源于电信行业的需求,由瑞典爱立信公司于1986年开发。Erlang以其独特的并发模型、轻量...
诊断以及调试生产环境中的Erlang 系统。在程序员学习新的语言和环境时,都需要一个摸索 阶段,也就是学会在社团的帮助下,脱离指南,解决实际问题。 本书假设读者精通基本的Erlang和OTP框架。在本书中,会对一些难以...
8. **数据结构**:虽然Erlang的原生数据结构相对简单(如列表、元组和映射),但它们在处理游戏数据时仍非常高效。例如,元组用于存储固定大小的游戏状态,映射则适用于动态属性的管理。 9. **并发原语**:Erlang的...