元组(tuple)
1. 概念
元组可以理解为
信息的集合
,比如我们想用一个变量
表示一个人:
名字:coco
性别:男
年龄:18
如果通过之前学到知识,我们可以用三个变量来表示
> Name = "coco".
"coco"
> Gender = "男".
"男"
> Age = 18.
18
那么我们用元组(tuple)来描述这些信息()
CocoInfo = {"coco", "男", 18}.
{"coco", "男", 18}
这就是元组实际开发中的使用方式
2. 创建元组
通过使用
{...}
来创建元组(元组中如果引用未赋值的变量,会报错),参考下面的例子
> Name = { name, "coco" }.
{ name, "coco" }
> Gender1 = { gender, man }.
{ gender, man }
> Gender2 = { gender , woman }.
{ gender, woman }
> Age = { age, 18 }.
{ age, 18 }
> Err1 = { err1, Coco }.
* 1: variable 'Coco' is unbound
3. 提取元组的值
加入我们通过元组保存了一个人的信息后,那么我们怎么再得到这个人的信息呢?
这里用到的模式匹配
,具体什么是模式匹配
请参考上一章内容
我们接着上面的例子进行讲解,首先我们尝试获取名字
> { name, PersonName } = Name.
{ name,"coco" }
然后我们再查看一下下载
PersonName
的值是多少
> PersonName.
"coco"
我们详解为什么会是这样?
首先我们知道,Name
保存的值是{ name, "coco" }
所以实际的等式是这样的
{ name, PersonName } = { name, "coco" }.
我们知道,
模式匹配
只有在等号两边
的值完全相等
的时候,等式才会成立
{ name, "coco" } = { name, "coco" }.
但是因为
PersonName
这个变量我们没有定义(没有赋值/未知的),那么怎么才能让等式成立?
假设:PersonName = "coco"
,那么等式成立
所以:PersonName
等于"coco"
这里利用上学时的函数编程中的假设,更好理解
那么尝试获取下性别
Gender1
、Gender2
和年龄Age
吧
4. 元组的嵌套
元组是可以嵌套的,比如刚刚我们在 2. 中用了三个变量去形容了一个人,现在我们尝试利用嵌套的方式来描述一个人的信息。这里我们重新启动erlang shell,可以输入
ctrl + c
,然后再输入erl
> Something = { person, { name, "coco"}, { gender, "男" }, { age, 18} }.
{ person, { name, "coco"}, { gender, "男" }, { age, 18} }.
第一个元素,使用了一个原子
person
,代表这个元组描述了一个人,后面的元素是这个人的详细信息
第二个元素是一个元组,该元组中 第一个元素是一个原子name
,代表这个元组描述的是真个人的名字,第二个元素是这个人的具体名字
第三个元素是一个元组,该元组中 第一个元素是一个原子gender
,代表这个元组描述的是这个人的性别,第二个元素是这个人的具体性别
第四个元素是一个元组,该元组中 第一个元素是一个原子age
,代表这个元组描述的是这个人的年龄,第二个元素是这个人的具体年龄
5. 提取嵌套后的元组信息
- 定义的元组数据
> Something = { person, { name, "coco"}, { gender, "男" }, { age, 18} }. { person, { name, "coco"}, { gender, "男" }, { age, 18} }.
- 正确的提取方式
> { person, { name, Name }, { gender, Gender }, { age, Age} } = Something. { person, { name, "coco"}, { gender, "男" }, { age, 18} } > Name. "coco" > Gender. "男" > Age. 18
- 错误的提取方式
> { person, { name, Name }, { gender, Name }, { age, Age} } = Something. ** exception error: no match of right hand side value {person,{name,"coco"},{gender,"男"},{age,18}}
Name
不能同时是"coco"
, 又是"男"
,等式不可能成立,所以报错
6. 通过 占位符("_")
提取元组数据
"_"
占位符可以忽略我们不在乎的值,同一个等式中,"_"
占位符可以有不同的值
重启 erlang shell
> Something = { person, { name, "coco" }, { gender, "男" }, { age, 18} }.
{ person, { name, "coco" }, { gender, "男" }, { age, 18 } }
> { _, { _, Name }, { _, Gender }, { _, Age} } = Something.
{ person, { name, "coco" }, { gender, "男" }, { age, 18 } }
> Name.
"coco"
> Gender.
"男"
> Age.
18