跳到主要内容

变量和可变性(Variables)

在 Rust 中,变量(Variables)默认是不可变的。这是 Rust 推动你以充分利用 Rust 提供的安全性和简单并发性来编写代码的众多方式之一。

变量声明

不可变变量

fn main() {
let x = 5;
println!("x 的值是: {}", x);

// x = 6; // 这行代码会导致编译错误
}

可变变量

使用 mut 关键字声明可变变量:

fn main() {
let mut x = 5;
println!("x 的值是: {}", x);

x = 6;
println!("x 的值是: {}", x);
}

变量遮蔽 (Shadowing)

你可以定义一个与之前变量同名的新变量:

fn main() {
let x = 5;

let x = x + 1;

{
let x = x * 2;
println!("内部作用域中 x 的值是: {}", x); // 12
}

println!("x 的值是: {}", x); // 6
}

常量

常量使用 const 关键字声明,必须注明值的类型:

const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;

fn main() {
println!("三小时等于 {} 秒", THREE_HOURS_IN_SECONDS);
}

变量与常量的区别

特性变量常量
关键字letconst
可变性可以用 mut总是不可变
类型注解可选必须
作用域块级作用域全局或块级
计算时机运行时编译时

变量的作用域

变量的作用域是指程序中该变量有效的范围:

fn main() {
{ // s 在这里无效,它尚未声明
let s = "hello"; // 从此处起,s 是有效的

// 使用 s
println!("{}", s);
} // 此作用域已结束,s 不再有效

// println!("{}", s); // 错误!s 已经超出作用域
}

最佳实践

  1. 默认使用不可变变量:除非确实需要改变值,否则使用 let 而不是 let mut
  2. 使用有意义的变量名:变量名应该清楚地表达其用途
  3. 适当使用遮蔽:当需要改变变量类型时,遮蔽比可变变量更合适
// 好的做法:使用遮蔽改变类型
let spaces = " ";
let spaces = spaces.len();

// 不推荐:使用可变变量改变类型(这会编译错误)
// let mut spaces = " ";
// spaces = spaces.len(); // 错误!不能改变类型