Skip to content

元组Tuple

1.复合类型

在编程中,我们经常需要将多个值组合在一起形成更有意义的数据单元,那就是复合类型

Rust 提供了一系列强大的复合类型工具,让我们能够以类型安全的方式构建复杂数据结构。

2.元组的定义

元组是一种异构有限序列

  • 异构是指元组内的元素可以是不同类型
  • 有限是指元组的长度是固定的

2.1 类型推导

元组的定义使用小括号(),在小括号中定义一个个值,里面的值会自动类型推导

rust
let t = (val1, val2, val3...)

示例

rust
let t = (666, true, false);

2.2 类型标注

也可以强制标注每一个值的类型,在变量名后面使用:(),依次为后面的值标注类型

rust
let t: (type1, type2, type3...) = (val1, val2, val3...);

将类型放在()内,每个类型之间用逗号隔开,这就是元组的类型。例如(i32, f64)就是一个类型,对应的该类型下的值,就是在()内每个位置放上对应的值,比如(15, 3.14)就是一个符合上述类型的元组。

3.访问元组内元素

通过元组名.下标可以访问一个元组内的元素:

rust
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.最后的逗号

元组中,最后一个元素末尾可以携带逗号,这是其它语言比较少见的设计。

以下四种写法都是正确的:

rust
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的第一版本:

rust
let tuple = (
    100, 
    3.14, 
    true,
);

如果后续某次对这个元组需要进行修改,添加一个新元素:

rust
let tuple = (
    100, 
    3.14, 
    true,
    "hello", // diff
);

此时只会造成一行diff,很明确本次修改新增了一个元素。

如果是其他语言,那么要先在前一行添加逗号,下一行再写新元素,就会造成两行diff,但只有一行有实际意义的修改。

但是当元组只有一个元素的时候,必须携带末尾的逗号

rust
let tuple: (i32,) = (2025,);

类型和值末尾的逗号都不能省略,因为(2025)是一个表达式,小括号本身是用来调节计算顺序的,他不修改实际值。因此 (2025) == 2025,它们是全等的。

如果要实现单元素的元组,必须用一个末尾的逗号来表明这是一个元组,防止被解析为单个元素外套一层小括号。


5.模式匹配解构

元组支持一种特殊的语法解构赋值,它可以快速取出元组中的元素,赋值到变量上。

例如:

rust
let point = (10, 20);
let (x, y) = point;  // 解构元组
println!("坐标: x={}, y={}", x, y); // 坐标: x=10, y=20

其中 let (x, y) = point 就是一个解构,它把point 这个元组的前两个元素,按位置赋值到变量xy上。

也可以在定义的时候就解构

rust
let (x, y) = (10, 20);  // 解构元组
println!("坐标: x={}, y={}", x, y); // 坐标: x=10, y=20

也可以通过_来跳过某些元素:

rust
let (first, _, third) = (1, "hello", true);
println!("first={}, third={}", first, third); // first=1, third=true

上例中,相当于忽略了元组中第二个元素,只提取第一个和第三个元素。

_是用来跳过结构的特殊符号,不可当作变量名使用

6.单元类型

当一个元组不含任何元素,也就是长度为0,称为空元组,也称为单元类型()

rust
let unit: () = ();

单元类型 () 表示"没有有意义的值",常用于不需要返回值的函数或表达式中。它占用0字节,在内存中不实际存在。

比如当一个函数省略了返回值,或者一个表达式没有具体值,返回的都是(),所谓单元类型本质就是一个空元组。

MIT Licensed