在 Rust 中,常量是编译时确定且不可变的值,用于定义程序中不会改变的数据。与变量不同,常量必须显式指定类型,并且可以在全局作用域中声明,这使得它们非常适合用于配置或数学常数。
常量的基本语法
使用 const
关键字声明常量,语法为:const NAME: type = value;。常量名通常使用大写字母和下划线,以提高可读性。下面的示例展示如何定义一个圆周率常量。
const PI: f64 = 3.14159;
fn main() {
println!("圆周率的值是: {}", PI);
}
// 输出: 圆周率的值是: 3.14159
注意:常量必须在编译时求值,因此不能使用运行时计算的值。
常量表达式和编译时计算
Rust 允许在常量中使用常量表达式,这些表达式在编译时求值。例如,你可以定义基于其他常量的值,或者使用简单的算术运算。
const TWO: i32 = 2;
const SQUARE: i32 = TWO * TWO; // 编译时计算为 4
fn main() {
println!("TWO 的平方是: {}", SQUARE);
}
// 输出: TWO 的平方是: 4
使用常量提高代码可维护性
将魔法数字或字符串定义为常量可以使代码更清晰、易于维护。例如,在配置应用程序时,使用常量来定义默认值或限制。
const DEFAULT_TIMEOUT: u64 = 30;
fn process_request(timeout: u64) {
if timeout > DEFAULT_TIMEOUT {
println!("请求超时");
}
}
fn main() {
process_request(20);
// 输出: (无输出,因为 20 <= 30)
}
通过这种方式,如果需要更改这些值,只需修改常量定义,而不必搜索整个代码库。
常量的作用域和可见性
常量可以在模块或全局作用域中声明,并且默认是私有的。使用 pub 关键字可以使其公开,以便在其他模块中使用。
mod config {
pub const API_KEY: &str = "secret-key";
const INTERNAL_VALUE: i32 = 42; // 私有常量
}
fn main() {
println!("API 密钥: {}", config::API_KEY);
// println!("{}", config::INTERNAL_VALUE); // 错误: 私有常量不可访问
}
// 输出: API 密钥: secret-key