《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)
8.2.1 元组的定义
元组是Rust的内置复合数据类型。Rust支持元组,而且元组是一个复合类型。我们知道,标量类型只能存储一种类型的数据。例如一个i32类型的变量只能存储一个数字。复合类型可以存储多个不同类型的数据。复合类型就像我们的菜篮子,里面可以放各种类型的菜。
元组可以将其他不同类型的多个值组合到一个复合类型中。元组还拥有一个固定的长度:无法在声明结束后增加或减少其中的元素数量。通常使用逗号分隔后放置到一对圆括号中创建一个元组。元组每个位置的值都有一个类型,这些类型不需要相同。元组是一个可以包含各种类型值的组合,是把几个类型组合到一起的最简单的方式。元组使用一对圆括号"()"来构造。如果元组中只包含一个元素,应该在后面添加一个逗号,以区分表达式和元组。
值得注意的是,元组有着固定的长度。而且一旦定义,就不能再增长或缩小。元组的下标从0开始。Rust中元组的定义很简单,就是使用一对圆括号把所有元素放在一起,元素之间使用逗号分隔。定义元组数据类型的时候也是一样的。在Rust语言中,元组的定义语法格式如下:
let tuple_name:(data_type1,data_type2,data_type3,..., data_typeN) = (value1,value2,value3,...,valueN);
定义元组时也可以忽略数据类型,比如:
let tuple_name = (value1,value2,value3,...,valueN);
但需要注意的是,如果显式指定了元组的数据类型,那么数据类型的个数必须和元组的个数相同,否则会报错。比如我们定义一个元组:
let tuple:(i32,f64,u8) = (-325,4.9,22);
8.2.2 元组的输出
如果要输出元组中的所有元素,必须使用{:?}格式化符。
fn main() {
let tuple:(i32,f64,u8) = (-325,4.9,22);
println!("{:?}",tuple);
}
编译运行以上Rust代码,输出结果如下:
(-325, 4.9, 22)
仅仅使用下面的输出语句是不能输出元组中的元素的。
println!("{ }",tuple)
这是因为元组是一个复合类型,要输出复合类型的数据,必须使用println!("{:?}", tuple_name)。
8.2.3 访问元组中的单个元素
我们可以使用元组名.索引数字来访问元组中相应索引位置的元素,索引从0开始。例如下面这个拥有3个元素的元组:
let tuple:(i32,f64,u8) = (-325,4.9,22);
可以通过下面的方式访问各个元素:
tuple.0 // -325
tuple.1 // 4.9
tuple.2 // 22
下面的范例演示如何通过元组名.索引数的方式输出元组中的各个元素,代码如下:
fn main() {
let tuple:(i32,f64,u8) = (-325,4.9,22);
println!("integer is :{:?}",tuple.0);
println!("float is :{:?}",tuple.1);
println!("unsigned integer is :{:?}",tuple.2);
}
编译运行以上Rust代码,输出结果如下:
integer is :-325
float is :4.9
unsigned integer is :2
再来看一个范例:
fn main() {
//包含各种不同类型的元组
let long_tuple = (
1u8, 2u16, 3u32, 4u64, -1i8, -2i16, -3i32, -4i64, 0.1f32, 0.2f64, 'a', true,
);
//通过元组的下标来访问具体的值
println!("long tuple first value: {}", long_tuple.0);
println!("long tuple second value: {}", long_tuple.1);
println!("long_tuple: {:?}", long_tuple);
//元组也可以充当元组的元素
let tuple_of_tuples = ((1u8, 2u16, 2u32), (4u64, -1i8), -2i16);
//元组可以打印
println!("tuple of tuples: {:?}", tuple_of_tuples);
//但很长的元组无法打印
//let too_long_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
//println!("too long tuple: {:?}", too_long_tuple);
//创建单元素元组需要一个额外的逗号,这是为了和被括号包含的字面量进行区分
println!("one element tuple: {:?}", (5u32,));
println!("just an integer: {:?}", (5u32));
}
结果输出:
long tuple first value: 1
long tuple second value: 2
long_tuple: (1, 2, 3, 4, -1, -2, -3, -4, 0.1, 0.2, 'a', true)
tuple of tuples: ((1, 2, 2), (4, -1), -2)
one element tuple: (5,)
just an integer: 5