Rust 1.57.0: константный panic!, пользовательские профили в Cargo и обработка ошибок выделения памяти

в 16:44, , рубрики: cargo, clippy, open source, release, Rust, rustc, rustdoc, rustfix, rustfmt, stable, выпуск версий, Компиляторы, новости технологий, перевод, Программирование, системное программирование, стабильная версия, языки программирования

Команда Rust рада сообщить о выпуске новой версии — 1.57.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.57.0 вам достаточно выполнить следующую команду:

rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.

Что стабилизировано в 1.57.0

Rust 1.57 привносит panic! в константные контексты, добавляет поддержку настраиваемых профилей в Cargo и стабилизирует ошибочные API резервирования.

panic! в константных контекстах

С предыдущими версиями Rust макрос panic! не использовался в const fn и других контекстах времени компиляции. Теперь это стабилизировано. Вместе со стабилизацией panic! в const теперь можно использовать несколько других стандартных библиотечных API, например assert!.

Эта стабилизация ещё не включает в себя полную инфраструктуру форматирования, так что макрос panic! должен вызываться либо со статической строкой ( panic!("...") ), либо с одним интерполированным значением &str (panic!("{}", a)), которое должно использоваться с {} (без формата спецификаторов или других типажей).

Ожидается, что в будущем эта поддержка будет расширяться, но такая минимальная стабилизация уже позволяет проверять простые утверждения во время компиляции, например проверки размера типа:

const _: () = assert!(std::mem::size_of::<u64>() == 8);
const _: () = assert!(std::mem::size_of::<u8>() == 1);

Поддержка пользовательских профилей в Cargo

Cargo уже давно поддерживает четыре профиля: dev, release, test и bench. В Rust 1.57 добавлена поддержка профилей с произвольными именами.

Например, если вы хотите включить оптимизацию времени компоновки (LTO) только при создании окончательной производственной сборки, добавление следующего фрагмента в Cargo.toml включает lto, когда этот профиль выбран, но избегает включения его для сборок с профилем release.

[profile.production]
inherits = "release"
lto = true

Обратите внимание, что пользовательские профили должны указывать профиль, от которого они наследуют настройки по умолчанию. После того, как профиль определён, у команд Cargo, которые строят код, можно попросить использовать его с --profile production. В настоящее время артефакты будут собираться в отдельном каталоге (target/production). Это означает, что артефакты не используются совместно между каталогами.

Обработка ошибок при выделении памяти

Rust 1.57 стабилизирует try_reserve для Vec, String, HashMap, HashSet и VecDeque. Этот API позволяет вызывающему коду обрабатывать ошибку выделения памяти для этих типов.

Rust обычно прерывает процесс, если глобальный распределитель памяти даёт сбой, что не всегда желательно. Этот API предоставляет метод, позволяющий избежать такого прерывания при работе с коллекциями из стандартной библиотеки. Однако Rust не гарантирует, что возвращаемая память фактически выделена ядром: например, если в Linux включён overcommit, память может быть недоступна при попытке её использования.

Стабилизированные API

Стабилизированы следующие методы и реализации типажей.

Следующие ранее стабилизированные API стали const:

Прочие изменения

Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.

Участники 1.57.0

Множество людей собрались вместе, чтобы создать Rust 1.57.0. Мы не смогли бы сделать это без всех вас. Спасибо!

От переводчиков

С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков. Также можете поддержать нас на OpenCollective.

Данную статью совместными усилиями перевели belanchuk, andreevlex, MaybeWaffle, TelegaOvoshey и funkill.

Автор:
RustLangRu

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js