Skip to content

变量与绑定

本章介绍如何用 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 绑定的区别简述:

特性constlet
可否省略类型常可推断
作用域全局或块级块级
可否与 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

小结

  • 使用 let 绑定;默认不可变,需要修改时用 let mut
  • const 用于编译期常量;static 用于整个程序生命周期的全局数据。
  • 再次 let 同名可遮蔽前一个绑定,便于在同一名字上做多步变换或改变类型。
  • 需要算术、比较等运算时,见运算符;需要系统了解整数、浮点、元组、数组等时,见数据类型