在 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