Keyword const

source ·
Expand description

编译时常量、编译时可评估函数和裸指针。

编译时常量

有时,某个值在整个程序中会多次使用,并且一遍又一遍地复制它会变得很不方便。 而且,使其成为每个需要它的函数的变量并非总是可能或不希望的。 在这些情况下,const 关键字为代码复制提供了一种方便的替代方法:

const THING: u32 = 0xABAD1DEA;

let foo = 123 + THING;
Run

常量必须显式地输入。与 let 不同,您不能忽略它们的类型并让编译器确定它的类型。 可以在 const 中定义任何常量值,而实际上 const 恰好是大多数在常量中合理的东西 (除非使用 const fn`s)。

例如,您不能将 File 作为 const

常量中唯一允许的生命周期是 'static,它是 Rust 程序中包含所有其他生命周期的生命周期。 例如,如果您想定义一个常量字符串,它将看起来像这样:

const WORDS: &'static str = "hello rust!";
Run

多亏了静态生命周期省略,您通常不必显式使用 'static

const WORDS: &str = "hello convenience!";
Run

const 项看起来与 static 项非常相似,这就造成了一些混淆,不知道应该在什么时间使用哪个项。 简而言之,常量在任何使用它们的地方都被内联,使用它们与简单地用它的值替换 const 的名称是相同的。 另一方面,静态变量指向内存中所有访问共享的单个位置。 这意味着,与常量不同,它们不能具有析构函数,并且在整个代码库中都可以充当单个值。

常量 (如静态变量) 应始终位于 SCREAMING_SNAKE_CASE 中。

有关 const 的更多详细信息,请参见 Rust 书Reference

编译时可评估函数

const 关键字的另一个主要用途是在 const fn 中。 这将一个函数标记为可以在 conststatic 项的主体中以及在数组初始化程序 (通常称为 “常量上下文”) 中被调用。 const fn 被限制在它们可以执行的操作集合中,以确保它们可以在编译时进行计算。 有关更多详细信息,请参见 Reference

fn 转换为 const fn 对该函数的运行时使用没有影响。

const 的其他用途

const 关键字也与 mut 一起用于裸指针中,如 *const T*mut T 所示。 可以在 指针原语 的 Rust 文档中阅读有关裸指针中使用的 const 的更多信息。