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(第三行),这从反面证明了长度固定性。程序正常结束且无错误输出,即判定通过。