一,元组定义:
类型可不同:元组是几个值的集合,用小括号把几个值包起来,可以是不同类型的(特殊情况下可变)。
长度不可变: 元组有着固定的长度。而且一旦定义,就不能再增长或缩小。
下标:元组的下标从 0 开始。
声明一个元组 let tuple_name = (value1,value2,...);
二,创建元组
let tuple_1 = (); //空元组: ()
let tuple_2 = (0,); //只有一个值时,需要加逗号: (0,)
let tuple_3 = (1,true,3.14);//定义元组时也可以忽略数据类型
let tuple_4: (i32,bool,f64) = (3,true,3.14);
let tuple_of_tuples = ((1u8, 2u16), ( -1i8), -2i16);
//打印元组数据
println!("tuple_of_tuples is {:?}", tuple_of_tuples);//输出元组中的所有元素,必须使用 {:?} 格式化符。
println!("just an integer: {:?}", (5u32,-1i8));
console:
tuple_of_tuples is ((1, 2), -1, -2)
just an integer: (5, -1)
三,获取元组值的两种方式
//把元组赋值给变量
let tuple_a: (i32,bool,f64) = (3,true,3.14);
let (a,b,c) = tuple_a;
println!("a={},b={},c={}",a,b,c);
//元组通过.下标来获取其中的值,下标从0开始
let tuple_b: (i32,bool,f64) = (3,true,3.14);
let a = tuple_b.0;
let b = tuple_b.1;
let c = tuple_b.2;
println!("a={},b={},c={}",a,b,c);
console:
a=3,b=true,c=3.14
a=3,b=true,c=3.14
四,元组的类型和值可变
let mut tuple_c: (i32,bool,f64) = (3,true,3.14);
tuple_c.0 = 6;//元素的值可以改变
println!("{}",tuple_c.0);
let mut tuple_d: (u16,bool,f64) = (255,true,3.14);
let num_u16_1:u16 = 65535;
//tuple_d.0 = num_u16_1;//error mismatched types 显示声明类型时,类型不可变
println!("tuple_d is {:?}", tuple_d);
let mut tuple_e = (255,true,3.14);//默认i32,bool,f64
tuple_e.0 = num_u16_1;// 0 的类型被修改了: u16,bool,f64
println!("tuple_e is {:?}", tuple_e);
let num_u32_1:u32 = 4294967295;//隐式声明元组后,第一次被显示声明的改变后不可再次改变类型
//tuple_e.0 = num_u32_1;//error mismatched types
console:
6
tuple_d is (255, true, 3.14)
tuple_e is (65535, true, 3.14)
五,解构
tup 变量绑定到整个元组上,因为元组是一个单独的复合元素。为了从元组中获取单个值,可以使用模式匹配来解构元组值。或者直接结构声明,这个后期比较常用的方式。
let tup = (2.0, 3.4, 1.1);
let (x, y, z) = tup;
println!(" x : {},y : {},z : {}", x,y,z);
//或直接这样声明
let (x, y, z) = (1,2,3);
println!(" x : {},y : {},z : {}", x,y,z);
//特殊类型需要特殊
let (x, mut y, z) = (2.2,2,[1,3]);
y+=1;
println!(" x : {},y : {},z : {}", x,y,z[0]);