4. 元组与数组 创建元组和数组,访问元素,并演示数组越界时的编译或运行错误。
任务说明
本案例将完成三项核心任务:创建元组和数组、通过索引访问元素、演示数组越界时的编译错误。你将直接编写并运行一段Rust代码,观察编译器对越界访问的静态检查行为。
代码实现
fn main() {
// ---------- 元组创建与访问 ----------
// 元组可以包含不同类型的数据
let tuple: (i32, f64, &str) = (42, 3.14, "Rust");
// 使用点号加索引访问元组元素(索引从0开始)
let first = tuple.0;
let second = tuple.1;
let third = tuple.2;
println!("元组第一个元素: {}", first);
println!("元组第二个元素: {}", second);
println!("元组第三个元素: {}", third);
// 元组解构
let (a, b, c) = tuple;
println!("解构后: a={}, b={}, c={}", a, b, c);
// ---------- 数组创建与访问 ----------
// 数组所有元素必须类型相同,长度固定
let array: [i32; 5] = [10, 20, 30, 40, 50];
// 使用方括号加索引访问数组元素
println!("数组第一个元素: {}", array[0]);
println!("数组第三个元素: {}", array[2]);
println!("数组最后一个元素: {}", array[4]);
// 遍历数组
for element in array.iter() {
print!("{} ", element);
}
println!();
// ---------- 数组越界演示 ----------
// 下面这行代码访问索引5(数组长度为5,有效索引为0~4)
// 这会导致编译错误:index out of bounds
let out_of_bounds = array[5];
println!("越界访问结果: {}", out_of_bounds);
}
编译与运行
将上述代码保存为 main.rs,在终端执行 rustc main.rs 进行编译。你会看到编译器输出类似以下错误信息:
error: this operation will panic at runtime
--> main.rs:30:31
|
30 | let out_of_bounds = array[5];
| ^ index out of bounds: the length is 5 but the index is 5
|
= note: `#[deny(unconditional_panic)]` on by default
这是Rust编译器在编译阶段就检测到了越界访问,并直接拒绝生成可执行文件。这是Rust内存安全保证的核心体现——越界错误不会留到运行时才暴露。
验证与判定标准
完成以下步骤即可判定本案例通过:
- 将代码中越界访问行(
let out_of_bounds = array[5];)注释掉,重新执行rustc main.rs,编译成功后会生成可执行文件; - 运行
./main,观察输出:应依次打印元组的三个元素、解构后的三个变量、数组的首/中/尾元素,以及遍历输出的10 20 30 40 50; - 恢复越界访问行,再次执行
rustc main.rs,确认编译器报错且不生成可执行文件——这证明越界在编译期即被拦截。