探索 Rust 元组与矩阵转置

RustRustBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将探索 Rust 中的元组。元组是不同类型值的集合,使用括号构建。它们可用作函数参数和返回值,使函数能够返回多个值。元组也可用作其他元组的成员。Rust 提供元组索引来访问元组中的值。元组是可打印的,并且可以解构以创建绑定。此外,我们将学习如何向结构体添加 fmt::Display 特性以自定义其打印格式。最后,我们有一个活动,要求实现一个 transpose 函数,该函数用于交换矩阵中的两个元素。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用 main.rs,并通过 rustc main.rs &&./main 进行编译和运行。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/floating_types("Floating-point Types") rust/DataTypesGroup -.-> rust/boolean_type("Boolean Type") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") subgraph Lab Skills rust/variable_declarations -.-> lab-99193{{"探索 Rust 元组与矩阵转置"}} rust/integer_types -.-> lab-99193{{"探索 Rust 元组与矩阵转置"}} rust/floating_types -.-> lab-99193{{"探索 Rust 元组与矩阵转置"}} rust/boolean_type -.-> lab-99193{{"探索 Rust 元组与矩阵转置"}} rust/type_casting -.-> lab-99193{{"探索 Rust 元组与矩阵转置"}} rust/function_syntax -.-> lab-99193{{"探索 Rust 元组与矩阵转置"}} rust/expressions_statements -.-> lab-99193{{"探索 Rust 元组与矩阵转置"}} rust/lifetime_specifiers -.-> lab-99193{{"探索 Rust 元组与矩阵转置"}} end

元组

元组是不同类型值的集合。元组使用括号 () 构建,每个元组本身是一个具有类型签名 (T1, T2,...) 的值,其中 T1T2 是其成员的类型。函数可以使用元组返回多个值,因为元组可以容纳任意数量的值。

// 元组可用作函数参数和返回值。
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 特性,这样如果你从打印调试格式 {:?} 切换到显示格式 {}, 你会看到以下输出:

    ( 1.1 1.2 )
    ( 2.1 2.2 )

    你可能需要回顾一下打印显示的示例。

  2. reverse 函数为模板添加一个 transpose 函数,该函数接受一个矩阵作为参数,并返回一个交换了两个元素的矩阵。例如:

    println!("矩阵:\n{}", matrix);
    println!("转置:\n{}", transpose(matrix));

    结果输出为:

    矩阵:
    ( 1.1 1.2 )
    ( 2.1 2.2 )
    转置:
    ( 1.1 2.1 )
    ( 1.2 2.2 )

总结

恭喜你!你已经完成了元组实验。你可以在 LabEx 中练习更多实验来提升你的技能。