首页 > Erlang相关 > Erlang元组与列表的区别和联系
2013
11-22

Erlang元组与列表的区别和联系

BACK TOP文章索引

  1. 定义
  2. 区别
  3. 联系
  4. 共6条评论

定义

在之前的教程中我们已对Erlang元组Erlang列表进行讲述,在这里讲述一下两者的区别和联系。

区别

1.列表中的元素个数是可变的,而元组的数目是在创建后就固定的。
    创建一个列表之后,我们仍然可以往其中增加项,当然可以删除项,因此列表使用的话比较灵活一些,而元组则不可以。

2.创建的方式不同
在声明元组的时候,就自动创建了一个元组。而对于列表来说,创建一个列表有两种方式,一种是直接定义,例如:F=[abc];另外一种是在已经创建的基础上再次添加一个项,那新构成的这个仍然是列表。
3.取值方式不同
从元组中提取字段值的时候,我们一般使用的是“=”来提取,而对于列表来说,使用的仍然还是模式匹配,只不过对于列表来说的话,我们每一次只能提取这个列表的头部,也就说一次只能提取一个项。
例如,对于元组提取元素的使用如下:

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提取出来的是还是一个列表。
4.在函数使用上的区别
这里我们还有一个需要注意的地方,在我们写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元组与列表的联系就在于:列表中的元素可以是元组,而元组中的元素则不可以为列表. 


Erlang元组与列表的区别和联系》有 6 条评论

  1. 以后需再关注,现在先帮你顶一下

  2. @Happiness: 语音助手

留下一个回复

你的email不会被公开。