当前位置: 欣欣网 > 码农

Rust 中的 `const` 和 `static`

2024-12-07码农


在 Rust 中,可以使用 const static 来定义全局变量。那么问题来了:为什么 Rust 提供了两种全局变量类型?难道一种还不够用吗?本文将带你了解这两者的区别以及如何选择合适的类型。

const 的语法与特性

语法

要声明一个 const 常量,通常在代码的开头定义,并且使用全大写的命名方式。例如:

const NUMBER_OF_DAYS: u32 = 7;

特性

  1. 编译时确定的值
    const 的值是在编译时确定的。如果你对编译过程不熟悉,可以先了解相关基础知识。

  2. 全局可访问且不会被释放
    const 值是全局的,在程序运行期间始终可用,并且不会从内存中释放。

  3. 不能分配在堆上
    const 值不能是堆分配的数据。如果你想了解哪些类型会分配在栈上或堆上,可以参考相关的类型分配表。

static 的语法与特性

语法

要声明一个 static 静态变量,同样需要在代码的开头定义,并使用全大写的命名方式。例如:

static DAYS_OF_THE_WEEK: [&str; 7] = [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday",
];

特性

  1. 可以在编译时创建,也可以在运行时创建
    static 的值通常在编译时创建,但在某些情况下(例如使用不安全代码)也可能在运行时创建。如果你对编译过程不熟悉,可以先了解相关基础知识。

  2. 全局可访问且不会被释放
    const 一样, static 值是全局的,在程序运行期间始终可用,并且不会从内存中释放。

  3. 可以分配在堆上
    static 值可以是堆分配的数据。这一特性使得它们适合用于跨线程共享的数据。

  4. 可以是可变的(需使用不安全代码)
    在编写不安全代码时, static 值可以是可变的。

如何选择: const 还是 static

使用 const 的场景

  • 编译时的常量值,例如数字、字符串、数学常数等。

  • 数据在整个程序生命周期内不会改变。

  • 使用 static 的场景

  • 跨线程共享的可变状态(需要同步机制)。

  • 涉及不安全代码的场景。

  • 总结

    Rust 提供了 const static 两种全局变量类型,以满足不同的需求。 const 更适合用于编译时的不可变常量,而 static 则适合用于需要跨线程共享或涉及堆分配的数据。在实际开发中,根据具体需求选择合适的类型,可以更好地利用 Rust 的特性,编写高效、安全的代码。

    示例代码

    以下是 const static 的简单示例代码:

    // 使用 const 定义编译时常量
    const PI: f64 = 3.141592653589793;

    // 使用 static 定义静态数组
    static WEEKDAYS: [&str; 7] = [
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday",
    ];

    希望这篇文章能帮助你更好地理解 Rust 中的 const static

    点击关注并扫码添加进交流群
    免费领取「Rust 语言」学习资料