方唐镜

我跳出来了,我又站回去了!我定义了一个变量,我又改了它!打我啊笨蛋!

包龙星

在 Rust 的公堂上,你可改不了!Rust 的变量默认是不可变的,就像这大清律例,岂容你随意篡改!

第五回:大清律例,变量与可变性

在其他语言(C/JS)里,变量就像方唐镜,想怎么变就怎么变。但在 Rust 里,默认情况下的变量就像刻在石头上的律法,是不可变 (Immutable) 的。

1. 不可变变量 (铁律)

fn main() {
    let x = 5;
    println!("x 的值是: {}", x);
    // x = 6; // 报错!试图修改不可变变量,会被拖出去打五十大板!
}

如果你非要改,就得加上 mut 关键字,这叫“申请修法”。

2. 可变变量 (变通)

加上 mut (mutable) 后,变量就可以修改了。

fn main() {
    let mut x = 5; // 允许修改
    println!("x 的值是: {}", x);
    x = 6; // 这次没问题!
    println!("x 变身后的值是: {}", x);
}

3. 变量遮蔽 (移形换影)

Rust 有一招绝学叫 Shadowing (遮蔽)。你可以重复定义同名变量,新的会盖住旧的。

fn main() {
    let x = 5;
    let x = x + 1; // 这是一个全新的 x,盖住了之前的
    let x = x * 2; // 又来一个 x
    println!("x 最后变成了: {}", x); // 12
}

这就像方唐镜换了身衣服(类型变了),虽然人名还叫方唐镜,但已经不是刚才那个了!

雷豹

常量 (const) 也是不可变的,那它跟变量有什么区别?

包龙星

常量是祖宗家法!必须注明类型,而且永远不能改,连 mut 都不行!

4. 常量 (祖宗家法)

const MAX_POINTS: u32 = 100_000;

动手时刻:让方唐镜改口

下面的代码会报错,请加上那个神奇的关键字,让方唐镜能改口供:

fn main() {
    let testimony = "我没打人";
    testimony = "我打了,怎么样?"; // 报错
    println!("{}", testimony);
}
查看锦囊妙计

let testimony 改成 let mut testimony

下一回:算盘打得响(运算符) →