Appearance
变量与绑定
本章介绍如何用 let 绑定值、何时需要可变绑定,以及常量、静态变量与遮蔽(shadowing)等常见写法。
用 let 声明变量
使用 let 把一个名字绑定到某个值上。绑定默认不可变:不能对同一绑定重新赋值。
rust
fn main() {
let x = 5;
println!("x = {}", x);
}编译器通常能根据右侧表达式推断类型;需要时也可以显式写出类型(与数据类型一章配合阅读)。
rust
let x: i32 = 5;可变绑定:mut
若需要在绑定之后修改其内容,使用 mut:
rust
fn main() {
let mut x = 5;
x = 10;
println!("x = {}", x);
}mut 只影响「能否通过该绑定修改内存」,并不改变类型本身。能改的是「变量指向的内容」(例如把 i32 换成另一个 i32),而不是随意换成另一种类型。
常量:const
常量在编译期求值,必须标注类型,且只能使用常量表达式:
rust
const MAX_VALUE: i32 = 100;
fn main() {
println!("MAX_VALUE = {}", MAX_VALUE);
}与 let 绑定的区别简述:
| 特性 | const | let |
|---|---|---|
| 可否省略类型 | 否 | 常可推断 |
| 作用域 | 全局或块级 | 块级 |
可否与 mut 组合 | 否(常量本身不可变) | let mut 表示可变绑定 |
静态变量:static
static 表示程序整个运行期间存在一份全局存储,同样必须写类型,且初始化表达式须为常量上下文:
rust
static APP_NAME: &str = "my-app";
fn main() {
println!("{}", APP_NAME);
}若需要修改静态数据,要使用 static mut 并放在 unsafe 块中访问,初学者应优先用 const、内部可变性(如 Mutex)等更安全的方式,详见后续进阶章节。
遮蔽(Shadowing)
可以再次使用 let 同名绑定,这会遮蔽前一个绑定,而不是对原绑定重新赋值(因此前后类型可以不同):
rust
fn main() {
let x = 5;
let x = x + 1; // 新绑定,仍是 i32
let x = x * 2;
println!("x = {}", x); // 12
let spaces = " ";
let spaces = spaces.len(); // 新绑定,类型变为 usize
println!("{}", spaces);
}与 mut 的对比:
- 遮蔽:通过新的
let产生新绑定,可以改变类型。 mut:同一绑定可变,类型不能通过赋值改成另一种类型。
命名与风格
Rust 代码中变量、函数一般使用 snake_case(小写加下划线),常量常用 SCREAMING_SNAKE_CASE。