元组Tuple
1.复合类型
在编程中,我们经常需要将多个值组合在一起形成更有意义的数据单元,那就是复合类型
Rust 提供了一系列强大的复合类型工具,让我们能够以类型安全的方式构建复杂数据结构。
2.元组的定义
元组是一种异构有限序列
- 异构是指元组内的元素可以是不同类型
- 有限是指元组的长度是固定的。
2.1 类型推导
元组的定义使用小括号(),在小括号中定义一个个值,里面的值会自动类型推导
let t = (val1, val2, val3...)示例
let t = (666, true, false);2.2 类型标注
也可以强制标注每一个值的类型,在变量名后面使用:(),依次为后面的值标注类型
let t: (type1, type2, type3...) = (val1, val2, val3...);将类型放在()内,每个类型之间用逗号隔开,这就是元组的类型。例如(i32, f64)就是一个类型,对应的该类型下的值,就是在()内每个位置放上对应的值,比如(15, 3.14)就是一个符合上述类型的元组。
3.访问元组内元素
通过元组名.下标可以访问一个元组内的元素:
let tuple: (i32, f64, bool) = (100, 3.14, true);
println!("第一个元素: {}", tuple.0); // 100
println!("第二个元素: {}", tuple.1); // 3.14
println!("第三个元素: {}", tuple.2); // true通过tuple.0可以访问到第一个元素,以此类推。
4.最后的逗号
元组中,最后一个元素末尾可以携带逗号,这是其它语言比较少见的设计。
以下四种写法都是正确的:
let tuple1: (i32, f64, bool) = (100, 3.14, true);
let tuple2: (i32, f64, bool,) = (100, 3.14, true);
let tuple3: (i32, f64, bool) = (100, 3.14, true,);
let tuple4: (i32, f64, bool,) = (100, 3.14, true,);不论是元组的值,还是元组的类型,最后一个逗号都可以保留。在后续的结构体等地方,也有类似的设计。
在git多次提交的时候,这种设计可以明确修改的行,比如:
以下是git的第一版本:
let tuple = (
100,
3.14,
true,
);如果后续某次对这个元组需要进行修改,添加一个新元素:
let tuple = (
100,
3.14,
true,
"hello", // diff
);此时只会造成一行diff,很明确本次修改新增了一个元素。
如果是其他语言,那么要先在前一行添加逗号,下一行再写新元素,就会造成两行diff,但只有一行有实际意义的修改。
但是当元组只有一个元素的时候,必须携带末尾的逗号:
let tuple: (i32,) = (2025,);类型和值末尾的逗号都不能省略,因为(2025)是一个表达式,小括号本身是用来调节计算顺序的,他不修改实际值。因此 (2025) == 2025,它们是全等的。
如果要实现单元素的元组,必须用一个末尾的逗号来表明这是一个元组,防止被解析为单个元素外套一层小括号。
5.模式匹配解构
元组支持一种特殊的语法解构赋值,它可以快速取出元组中的元素,赋值到变量上。
例如:
let point = (10, 20);
let (x, y) = point; // 解构元组
println!("坐标: x={}, y={}", x, y); // 坐标: x=10, y=20其中 let (x, y) = point 就是一个解构,它把point 这个元组的前两个元素,按位置赋值到变量x和y上。
也可以在定义的时候就解构
let (x, y) = (10, 20); // 解构元组
println!("坐标: x={}, y={}", x, y); // 坐标: x=10, y=20也可以通过_来跳过某些元素:
let (first, _, third) = (1, "hello", true);
println!("first={}, third={}", first, third); // first=1, third=true上例中,相当于忽略了元组中第二个元素,只提取第一个和第三个元素。
_是用来跳过结构的特殊符号,不可当作变量名使用
6.单元类型
当一个元组不含任何元素,也就是长度为0,称为空元组,也称为单元类型()。
let unit: () = ();单元类型 () 表示"没有有意义的值",常用于不需要返回值的函数或表达式中。它占用0字节,在内存中不实际存在。
比如当一个函数省略了返回值,或者一个表达式没有具体值,返回的都是(),所谓单元类型本质就是一个空元组。
