Выпуск Rust 1.28

оригинал: The Rust Core Team • перевод: XX • новости • поддержите на Patreon

Команда разработчиков 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. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!


Обсуждение — на форуме или /r/rustycrate.