元组 - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# 元组

元组是一个可以包含各种类型的值的集合。元组使用圆括号 `()` 来构造，而且每个元组本身是一个类型标记为 `(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);
    }

### 练习

1. 复习：为上面示例中的 `Matrix` 结构体添加 `fmt::Display` trait， 这样当你从打印调试格式 `{:?}` 切换到显示格式 `{}` 时， 你会看到以下输出：

       ( 1.1 1.2 )
       ( 2.1 2.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 )