元组
元组是一个可以包含各种类型的值的集合。元组使用圆括号 ()
来构造,而且每个元组本身是一个类型标记为 (T1, T2, ...)
的值,其中 T1
、T2
是其成员的类型。函数可以使用元组来返回多个值,因为元组可以存储任意数量的值。
// 元组可以用作函数参数和返回值。 fn reverse(pair: (i32, bool)) -> (bool, i32) { // `let` 可以用来把元组的成员绑定到变量。 let (int_param, bool_param) = pair; (bool_param, int_param) } // 以下结构体将用于后续练习。 #[derive(Debug)] struct Matrix(f32, f32, f32, f32); fn main() { // 一个包含多种不同类型的元组。 let long_tuple = (1u8, 2u16, 3u32, 4u64, -1i8, -2i16, -3i32, -4i64, 0.1f32, 0.2f64, 'a', true); // 可以使用元组索引来提取元组中的值。 println!("长元组的第一个值:{}", long_tuple.0); println!("长元组的第二个值:{}", long_tuple.1); // 元组可以作为元组的成员。 let tuple_of_tuples = ((1u8, 2u16, 2u32), (4u64, -1i8), -2i16); // 元组是可打印的。 println!("元组的元组:{:?}", tuple_of_tuples); // 但长元组(超过 12 个元素)无法打印。 //let too_long_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13); //println!("过长的元组:{:?}", too_long_tuple); // TODO ^ 取消上面两行的注释以查看编译器错误 let pair = (1, true); println!("对组是 {:?}", pair); println!("反转后的对组是 {:?}", reverse(pair)); // 创建单元素元组时,需要使用逗号来区分它们 // 与被括号包围的字面量。 println!("单元素元组:{:?}", (5u32,)); println!("仅是一个整数:{:?}", (5u32)); // 可以通过解构元组来创建绑定。 let tuple = (1, "hello", 4.5, true); let (a, b, c, d) = tuple; println!("{:?}、{:?}、{:?}、{:?}", a, b, c, d); let matrix = Matrix(1.1, 1.2, 2.1, 2.2); println!("{:?}", matrix); }
练习
-
复习:为上面示例中的
Matrix
结构体添加fmt::Display
trait, 这样当你从打印调试格式{:?}
切换到显示格式{}
时, 你会看到以下输出:( 1.1 1.2 ) ( 2.1 2.2 )
你可能需要回顾一下 打印显示 的示例。
-
参考
reverse
函数的模板,添加一个transpose
函数。 该函数接受一个矩阵作为参数,并返回一个交换了两个元素的矩阵。例如:println!("矩阵:\n{}", matrix); println!("转置:\n{}", transpose(matrix));
输出结果为:
Matrix: ( 1.1 1.2 ) ( 2.1 2.2 ) Transpose: ( 1.1 2.1 ) ( 1.2 2.2 )