Цикл for заработал на этапе компиляции, а вектор — собираться в константу

06.01.2026

В константных вычислениях разрешено строить вектор и перебирать диапазон циклом. Это заметное расширение того, что можно вычислить во время компиляции.

Что стало доступно

Создание вектора с заданной ёмкостью и добавление элементов работают во время компиляции. Новый метод превращает результат в глобальную константу — то есть объявленную один раз и вычисляемую при первом обращении.

Отдельно разрешено делать реализации итераторов константными, а значит цикл for в константном контексте становится допустим. Это первый случай, когда обычная конструкция языка работает при компиляции.

Какая задача решается

Таблицы соответствий, списки допустимых значений, сгенерированные наборы — всё это раньше приходилось либо зашивать в исходный текст, либо вычислять при запуске. Зашивка означает расхождение с исходными данными: список меняется, а таблица в коде — нет.

Вычисление при запуске означает затраты на старте, которых не хочется платить, если таблица не понадобится.

Почему это было трудно

Вектор хранит указатель на выделенную память и счётчик элементов. Во время выполнения такой указатель обычен. Во время компиляции выделение памяти — это вычисление значения, а значит, вектор обязан выглядеть как число, а не как адрес.

Новый метод делает это преобразование явным: он вычисляет содержимое и превращает его в значение, а не в ссылку на память.

Оригинал

const X: &'static [u32] = { let mut v = Vec::with_capacity(6); ... v.const_make_global() };

Упоминаний: 1 · Просмотров: 3