Ключевое слово const

Константы времени компиляции, блоки времени компиляции, вычисляемые во время компиляции функции и сырые указатели.

Константы времени компиляции

Иногда определённое значение используется многократно throughout программе, и его постоянное копирование может стать неудобным. Более того, не всегда возможно или желательно сделать его переменной, которая передаётся в каждую функцию, где оно нужно. В таких случаях ключевое слово const предоставляет удобную альтернативу дублированию кода:

#![allow(unused)]
fn main() {
const THING: u32 = 0xABAD1DEA;

let foo = 123 + THING;
}

Константы должны быть явно типизированы; в отличие от let, вы не можете опустить их тип и позволить компилятору вывести его. Любое постоянное значение может быть определено в const, что на практике охватывает большинство вещей, которые разумно иметь в константе (за исключением const fn). Например, вы не можете иметь File как const.

Единственное время жизни, допустимое в константе, — это 'static, которое охватывает все остальные времена жизни в программе на Rust. Например, если вы хотите определить константную строку, это будет выглядеть так:

#![allow(unused)]
fn main() {
const WORDS: &'static str = "hello rust!";
}

Благодаря элизии времени жизни static, обычно вам не нужно явно использовать 'static:

#![allow(unused)]
fn main() {
const WORDS: &str = "hello convenience!";
}

Элементы const выглядят очень похоже на элементы static, что вызывает некоторую путаницу в отношении того, что когда следует использовать. Проще говоря, константы встраиваются (inlined) везде, где они используются, что делает их использование идентичным простой замене имени const на его значение. Статические переменные, с другой стороны, указывают на единственное место в памяти, которое используют все обращения. Это означает, что, в отличие от констант, они не могут иметь деструкторы и выступают в качестве единого значения во всей кодовой базе.

Константы, как и статические переменные, всегда должны быть в SCREAMING_SNAKE_CASE.

Для получения более подробной информации о const см. книгу по Rust или Справочник.

Блоки времени компиляции

Ключевое слово const также может использоваться для определения блока кода, который вычисляется во время компиляции. Это полезно для обеспечения завершения определённых вычислений до оптимизаций, а также до времени выполнения. Для получения более подробной информации см. Справочник.

Вычисляемые во время компиляции функции

Другое основное использование ключевого слова const — в const fn. Это помечает функцию как вызываемую в теле элемента const или static и в инициализаторах массивов (обычно называемых "контекстами const"). const fn ограничены в наборе операций, которые они могут выполнять, чтобы гарантировать, что они могут быть вычислены во время компиляции. См. Справочник для получения более подробной информации.

Преобразование fn в const fn не влияет на использование этой функции во время выполнения.

Другие использования const

Ключевое слово const также используется в сырых указателях в сочетании с mut, как видно в *const T и *mut T. Подробнее о const, используемом в сырых указателях, можно прочитать в документации Rust для примитива pointer.