【Erlang】五、基本数据类型——元组(tuple)

本文深入探讨Erlang中的元组概念,包括元组的创建、使用及嵌套,重点介绍如何通过模式匹配从复杂嵌套元组中提取特定数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

元组(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"
这里利用上学时的函数编程中的假设,更好理解

那么尝试获取下性别Gender1Gender2和年龄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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值