Rust 变量绑定与可变性

Rust 中变量默认不可变,需显式声明 mut 才可修改。若尝试修改不可变变量会导致编译错误:

let x = 5;
x = 6; // 错误!无法修改不可变变量

解决方法
声明变量时添加 mut 关键字:

let mut x = 5;
x = 6; // 合法


变量遮蔽(Shadowing)

Rust 允许重复使用同名变量,新变量会遮蔽之前的绑定。与 mut 不同,遮蔽会创建新变量:

let x = 5;
let x = x + 1; // 合法,x 类型可改变

注意
遮蔽与 mut 的区别在于类型可变性。遮蔽后的变量可以改变类型,而 mut 仅允许修改值。


未使用变量警告

若变量未被使用,Rust 会发出警告:

let unused = 10; // 警告: unused variable

解决方法

  1. 使用变量名前加下划线忽略警告:
    let _unused = 10; // 无警告
    

  2. 实际使用变量(如打印或计算)。

变量作用域问题

变量只在声明的作用域内有效:

{
    let y = 3;
}
println!("{}", y); // 错误!y 已离开作用域

解决方法
确保变量在需要时仍处于作用域内,或通过返回值传递:

let y = {
    let temp = 3;
    temp // 返回 temp 的值
};
println!("{}", y); // 合法


所有权与移动(Move)

Rust 的变量赋值可能导致所有权转移:

let s1 = String::from("hello");
let s2 = s1;
println!("{}", s1); // 错误!s1 所有权已转移

解决方法

  1. 使用 clone 深拷贝数据:
    let s2 = s1.clone();
    

  2. 借用(引用)而非转移所有权:
    let s2 = &s1;
    


模式匹配中的变量绑定

matchif let 中可能意外覆盖变量:

let x = Some(5);
if let Some(y) = x {
    println!("{}", y); // y 仅在此块内有效
}

注意
匹配绑定的变量作用域限于分支代码块,避免与外部变量冲突。


常量与静态变量

常量 (const) 和静态变量 (static) 需明确类型且不能省略标注:

const MAX: u32 = 100_000; // 必须显式标注类型
static COUNTER: u32 = 0;

区别

  • 常量内联到使用处,无固定内存地址。
  • 静态变量有固定内存地址,全局有效。

类型推断失败

当类型无法推断时需显式标注:

let guess: u32 = "42".parse().expect("Not a number!");

常见场景
解析字符串、复杂表达式或多态类型时需明确类型。


变量未初始化

Rust 禁止使用未初始化变量:

let x: i32;
println!("{}", x); // 错误!x 未初始化

解决方法
确保变量在使用前被赋值,或使用 Option<T> 表示可能缺失的值:

let x: Option<i32> = None;

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐