2. 变量与可变性

任务说明

本案例通过一个可运行的Rust程序,演示let声明不可变变量与let mut声明可变变量的核心区别。你将看到:不可变变量在绑定后尝试修改会触发编译错误,而可变变量可以正常修改。最终程序输出两种变量的使用结果,帮助你建立对Rust所有权体系中“不可变性”与“可变性”的直观认知。

核心概念与代码实现

在Rust中,变量默认是不可变的。使用let声明的变量一旦绑定值,就不能再被重新赋值;若需修改变量值,必须在声明时加上mut关键字。下面的代码定义了一个不可变变量和一个可变变量,并分别尝试修改它们——对不可变变量的修改被注释掉,因为该代码若取消注释将无法通过编译。

fn main() {
    // 不可变变量:默认绑定后不可修改
    let number = 5;
    println!("不可变变量的值为: {}", number);

    // 下面的代码如果取消注释,将导致编译错误:
    // error[E0384]: cannot assign twice to immutable variable `number`
    // number = 6;

    // 可变变量:使用 mut 关键字声明,允许后续修改
    let mut count = 0;
    println!("可变变量初始值为: {}", count);
    count = count + 1;
    println!("修改后可变变量的值为: {}", count);

    // 演示不可变变量仍可被读取使用
    let sum = number + count;
    println!("两个变量之和为: {}", sum);
}

代码说明

上述程序首先声明了不可变变量number并绑定值5,随后通过println!输出其值。注释部分展示了尝试对不可变变量二次赋值会产生的编译错误信息(错误码E0384),这是Rust编译器在编译阶段就会拦截的违规操作。接着声明了可变变量count,初始值为0,通过count = count + 1将其修改为1并输出。最后将两个变量相加得到sum并打印,证明不可变变量虽然不能修改,但可以正常参与读取和计算。

编译与运行

将上述代码保存为main.rs,在终端执行以下命令:

rustc main.rs
./main

如果使用Cargo管理项目,也可以在项目目录下运行cargo run。

验证方法与判定标准

1. 编译通过验证:程序应无错误地编译并运行,输出以下三行内容(顺序一致):

不可变变量的值为: 5
可变变量初始值为: 0
修改后可变变量的值为: 1
两个变量之和为: 6

2. 不可变性验证:将代码中注释的number = 6;取消注释,重新执行rustc main.rs。此时编译必须失败,并显示错误信息cannot assign twice to immutable variable,错误码为E0384。这一步骤用于确认不可变变量确实无法被二次赋值。

3. 可变性验证:确认count变量在声明为mut后可以成功修改,且修改后的值(1)被正确输出。

let 与 mut 变量生命周期对比 let number = 5(不可变) 值: 5 ✓ 可读取 ✓ 可参与运算 ✗ 不可二次赋值 编译错误 E0384 let mut count = 0(可变) 值: 0 count = count + 1 值: 1 ✓ 可多次修改 默认不可变保证安全,mut 显式声明可变意图

预期输出

编译并运行成功后,终端将显示:

不可变变量的值为: 5
可变变量初始值为: 0
修改后可变变量的值为: 1
两个变量之和为: 6

以上输出由代码逻辑直接确定:number保持5,count从0变为1,两者之和为6。若取消注释不可变变量的赋值语句,编译将失败并报错,这正是验证不可变性的关键步骤。