4. 元组与数组

任务说明

本案例要求使用 Rust 创建元组(tuple)和数组(array),演示元素的访问方式,并验证两者在长度上的固定性——即元组和数组一旦创建,其长度不可改变。我们将通过一个完整的可运行程序来展示这些特性。

代码实现

fn main() {
    // ---------- 元组部分 ----------
    // 创建一个包含不同类型元素的元组
    let person: (&str, u32, f64) = ("Alice", 30, 1.68);

    // 通过索引访问元组元素(从0开始)
    let name = person.0;
    let age = person.1;
    let height = person.2;

    println!("=== 元组演示 ===");
    println!("姓名: {}, 年龄: {}, 身高: {:.2}m", name, age, height);

    // 元组解构(destructuring)
    let (name2, age2, _height2) = person;
    println!("解构获取: {} 今年 {} 岁", name2, age2);

    // ---------- 数组部分 ----------
    // 创建数组的两种方式
    let numbers: [i32; 5] = [10, 20, 30, 40, 50]; // 显式声明类型和长度
    let repeated = [7; 3]; // 包含3个7的数组

    println!("\n=== 数组演示 ===");
    println!("numbers 数组: {:?}", numbers);
    println!("repeated 数组: {:?}", repeated);

    // 通过索引访问数组元素
    let first = numbers[0];
    let third = numbers[2];
    println!("numbers[0] = {}, numbers[2] = {}", first, third);

    // 使用 .len() 获取长度
    println!("numbers 长度: {}, repeated 长度: {}", numbers.len(), repeated.len());

    // ---------- 长度固定性演示 ----------
    println!("\n=== 长度固定性验证 ===");
    println!("元组 person 的长度固定为 3(编译期确定)");
    println!("数组 numbers 的长度固定为 5,repeated 的长度固定为 3");

    // 尝试修改数组元素(允许修改值,但长度不变)
    let mut mutable_array = [1, 2, 3];
    mutable_array[0] = 100;
    println!("修改后 mutable_array: {:?}(长度仍为 3)", mutable_array);

    // 编译期验证:以下代码若取消注释将无法通过编译
    // let _invalid = person.3;        // 错误:元组索引越界
    // numbers.push(60);               // 错误:数组没有 push 方法
    // numbers[5] = 60;                // 错误:索引越界(运行时panic)

    println!("\n所有演示完成。元组和数组的长度在创建后不可改变。");
}

关键特性说明

  • 元组访问:使用 变量名.索引 语法(如 person.0),索引从 0 开始,编译期检查越界。
  • 数组访问:使用 变量名[索引] 语法,索引从 0 开始,运行时检查越界(越界会导致 panic)。
  • 长度固定性:元组的长度由元素个数在编译期确定;数组的长度是其类型的一部分(如 [i32; 5]),无法动态增减。
  • 可变性:数组元素的值可以修改(需声明 mut),但长度永远不变;元组元素默认不可变,即使声明 mut 也只能修改元素值,不能增删元素。

编译与运行

# 将上述代码保存为 main.rs,然后执行:
rustc main.rs
./main   # Windows 下为 main.exe

验证方法与判定标准

运行程序后,观察输出:

  • 元组部分应正确打印 姓名: Alice, 年龄: 30, 身高: 1.68m,解构输出 Alice 今年 30 岁。
  • 数组部分应打印 numbers 数组: [10, 20, 30, 40, 50] 和 repeated 数组: [7, 7, 7],索引访问输出 numbers[0] = 10, numbers[2] = 30,长度输出分别为 5 和 3。
  • 长度固定性部分应打印修改后的 mutable_array: [100, 2, 3],并显示长度仍为 3。

若取消注释代码中的三行“编译期验证”注释,程序将无法通过编译(前两行)或运行时 panic(第三行),这从反面证明了长度固定性。程序正常结束且无错误输出,即判定通过。

元组与数组内存布局及访问示意 元组 person: (&str, u32, f64) person.0 "Alice" person.1 30 person.2 1.68 长度固定 = 3(编译期确定) 数组 numbers: [i32; 5] [0] 10 [1] 20 [2] 30 [3] 40 [4] 50 长度固定 = 5(类型的一部分) 访问方式与长度固定性验证 元组访问: person.0 → "Alice" 越界访问: person.3 → 编译错误 长度不可变: 无法添加或删除元素 数组访问: numbers[2] → 30 越界访问: numbers[5] → 运行时 panic 长度不可变: 无 push/pop 方法