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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Команда 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


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


  • collections::TryReserveError
  • HashMap::try_reserve
  • HashSet::try_reserve
  • String::try_reserve
  • String::try_reserve_exact
  • Vec::try_reserve
  • Vec::try_reserve_exact
  • VecDeque::try_reserve
  • VecDeque::try_reserve_exact
  • Iterator::map_while
  • iter::MapWhile
  • proc_macro::is_available
  • Command::get_program
  • Command::get_args
  • Command::get_envs
  • Command::get_current_dir
  • CommandArgs
  • CommandEnvs

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


  • hint::unreachable_unchecked

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


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


Участники 1.57.0


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


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


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


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

Источник: https://habr.com/ru/post/593425/


Интересные статьи

Интересные статьи

RAM диск, это PCIe диск построенный на базе чипов RAM памяти. Такой диск не может сохранять данные после отключения питания (если не используется поддерживающий аккумулят...
iPhone быстрые? Да! Но почему? Apple мало что рассказывает нам про внутренности своих девайсов. Как будто скрывает от нас страшную тайну! Например, знали ли вы что в iPhone и в ...
Недавно я пытался заманить коллегу, сишника из соседнего отдела, на Тёмную сторону Rust. Но мой разговор с коллегой не задался. Потому что, цитата: В 2019 году я был на конференции C++ CoreHard,...
В этом посте мы рассмотрим этап работы с вершинами. То есть нам придётся снова достать учебники по математике и вспомнить линейную алгебру, матрицы и тригонометрию. Ура! Мы выясним, как прео...
Введение Язык программирования Rust, невзирая на всеохватывающую идеологию безопасности данных, располагает и небезопасными методиками программирования, ведь порой они могут повышать скорость ...