变量和可变性(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);
}
变量与常量的区别
特性 | 变量 | 常量 |
---|---|---|
关键字 | let | const |
可变性 | 可以用 mut | 总是不可变 |
类型注解 | 可选 | 必须 |
作用域 | 块级作用域 | 全局或块级 |
计算时机 | 运行时 | 编译时 |
变量的作用域
变量的作用域是指程序中该变量有效的范围:
fn main() {
{ // s 在这里无效,它尚未声明
let s = "hello"; // 从此处起,s 是有效的
// 使用 s
println!("{}", s);
} // 此作用域已结束,s 不再有效
// println!("{}", s); // 错误!s 已经超出作用域
}
最佳实践
- 默认使用不可变变量:除非确实需要改变值,否则使用
let
而不是let mut
- 使用有意义的变量名:变量名应该清楚地表达其用途
- 适当使用遮蔽:当需要改变变量类型时,遮蔽比可变变量更合适
// 好的做法:使用遮蔽改变类型
let spaces = " ";
let spaces = spaces.len();
// 不推荐:使用可变变量改变类型(这会编译错误)
// let mut spaces = " ";
// spaces = spaces.len(); // 错误!不能改变类型