Skip to content

Rust - 变量

变量是程序可以操作的命名存储位置。在 Rust 中,变量不仅仅是存储数据;它们与语言的核心原则——安全性和所有权——深度融合。

你使用 let 关键字声明变量。Rust 是一种静态类型语言,这意味着它必须在编译时知道所有变量的类型。然而,编译器很智能,通常可以根据你赋值的值推断出类型。

fn main() {
// 编译器推断 `x` 的类型为 i32(整数)
let x = 5;
// 在这里,我们显式地将类型标注为 64 位浮点数
let y: f64 = 3.14;
println!("The value of x is: {}", x);
println!("The value of y is: {}", y);
}

Rust 中的变量名遵循 snake_case 约定,即所有字母都是小写,单词之间用下划线分隔。它们可以包含字母、数字和下划线,但必须以字母或下划线开头。

Rust 的一个关键安全特性是变量默认是不可变的。一旦一个值绑定到一个名称上,你就不能更改该值。

fn main() {
let x = 5;
println!("The value of x is: {}", x);
// 下面这行代码会导致编译错误!
// x = 6; // error[E0384]: 不能两次赋值给不可变变量 `x`
// println!("The value of x is now: {}", x);
}

这种编译时检查防止了一大类值被意外更改的 bug。当你确切地知道一个值不会改变时,更容易推断你的代码行为。

当然,有时你需要更改变量的值。要使变量可变,你必须通过使用 mut 关键字来显式选择启用它。

fn main() {
let mut x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is now: {}", x);
}
The value of x is: 5
The value of x is now: 6

使用 mut 向其他开发者(以及你自己)表明,这个变量的值在其生命周期内预计会发生变化。

Rust 允许你声明一个与先前变量同名的新变量。这被称为遮蔽(shadowing)。新变量“遮蔽”了旧变量,并且旧变量从该作用域中的那一刻起变得不可访问。

fn main() {
let x = 5;
// 创建一个新的 `x`,遮蔽了第一个。
let x = x + 1;
{
// 在这个内部作用域中,创建了第三个 `x`,遮蔽了第二个。
let x = x * 2;
println!("The value of x in the inner scope is: {}", x);
}
// 当内部作用域结束时,第三个 `x` 消失,我们又回到了第二个 `x`。
println!("The value of x is: {}", x);
}
The value of x in the inner scope is: 12
The value of x is: 6

遮蔽与将变量标记为 mut 不同。遮蔽的一个主要好处是它允许你在重用变量名称的同时更改其类型,这在类型转换时通常很有用。

fn main() {
let spaces = " "; // `spaces` 是一个字符串切片
let spaces = spaces.len(); // `spaces` 现在被一个新的 `usize` 类型变量遮蔽
println!("There are {} spaces.", spaces);
}

这是允许的,因为我们正在使用 let 创建一个全新的变量。如果我们尝试使用 mut 来做这件事,它会失败,因为你不能更改变量的类型。