Выпуск Rust 1.28
Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.28.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.
Если у вас установлена предыдущая версия Rust с помощью rustup, то для обновления Rust до версии 1.28.0 вам достаточно выполнить:
1 | $ rustup update stable
|
Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.28.0 можно ознакомиться на GitHub.
Что вошло в стабильную версию 1.28.0
Глобальные аллокаторы
С помощью аллокаторов программы на Rust получают память во время выполнения.
Раньше Rust не позволял изменять способ распределения памяти, что ограничивало
его использование в некоторых случаях. На одних платформах использовался
jemalloc, на других — системный аллокатор, но пользователи не могли это
контролировать. В выпуске 1.28.0 стабилизирован атрибут #[global_allocator]
,
который позволяет программам на Rust выбирать системный аллокатор, а также
определять новые аллокаторы, реализуя типаж GlobalAlloc
.
Аллокатор по умолчанию для Rust-программ на некоторых платформах — это jemalloc.
Стандартная библиотека теперь предоставляет дескриптор системного аллокатора,
который можно использовать для переключения на использование системного аллокатора,
когда это необходимо, путём статического объявления с атрибутом #[global_allocator]
.
1 2 3 4 5 6 7 8 9 10 | use std::alloc::System; #[global_allocator] static GLOBAL: System = System; fn main() { let mut v = Vec::new(); // Память будет выделяться системным аллокатором. v.push(1); } |
Однако, иногда вам требуется определить собственный аллокатор для специфической
функциональной области вашего приложения. Это тоже относительно легко сделать,
реализовав типаж GlobalAlloc
. Подробнее о том, как это сделать, вы можете
прочитать в документации.
Улучшено сообщение об ошибке форматирования
Работа по улучшению диагностики продолжается, на этот раз с акцентом на форматирование:
1 | format!("{_foo}", _foo = 6usize); |
Раньше сообщение об ошибке в этом месте было довольно скудным:
1 2 3 4 | error: invalid format string: expected `'}'`, found `'_'` | 2 | format!("{_foo}", _foo = 6usize); | ^^^^^^^^ |
Теперь новое диагностическое сообщение указывает конкретную причину, по которой строка формата недействительна:
1 2 3 4 5 6 | error: invalid format string: invalid argument name `_foo` | 2 | let _ = format!("{_foo}", _foo = 6usize); | ^^^^ invalid argument name in format string | = note: argument names cannot start with an underscore |
Подробности смотрите в примечаниях к выпуску.
Стабилизация стандартной библиотеки
Кроме уже упомянутой стабилизации типажа GlobalAlloc
, в этом выпуске
стабилизированы NonZero
числовые типы. Это типы-обёртки вокруг
стандартных беззнаковых целочисленных типов: NonZeroU8
, NonZeroU16
,
NonZeroU32
, NonZeroU64
, NonZeroU128
и NonZeroUsize
.
Они позволяют оптимизировать размер хранящихся данных. Например, Option<u8>
занимает два байта, тогда как Option<NonZeroU8>
— один. Обратите внимание,
что эта оптимизация сохраняется даже тогда, когда NonZeroU8
завернут внутрь
другой структуры; в примере ниже показано, что Door
по-прежнему занимает
один байт, даже когда он помещён внутрь Option
. Эта оптимизация применима
также и к перечислениям, определённым пользователем, Option
тут не является
особенным.
1 2 3 4 5 6 7 8 9 10 11 12 13 | use std::mem; use std::num::NonZeroU8; struct Key(NonZeroU8); struct Door { key: Key, } fn main() { assert_eq!(mem::size_of::<Door>(), 1); assert_eq!(mem::size_of::<Option<Door>>(), 1); } |
Также было стабилизировано множество других компонентов библиотеки, полный список которых вы найдёте в подробных примечаниях к выпуску.
Улучшения в Cargo
Cargo теперь не позволит вам публиковать пакеты со скриптами сборки, которые
модифицируют каталог src
. Каталог src
в пакете следует считать
неизменяемым.
Разработчики 1.28.0
Множество людей участвовало в разработке Rust 1.28. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!