- PVSM.RU - https://www.pvsm.ru -
Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.28.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.
Если у вас установлена предыдущая версия Rust с помощью rustup, то для обновления Rust до версии 1.28.0 вам достаточно выполнить:
$ rustup update stable
Если у вас еще не установлен rustup, вы можете установить его [1] с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.28.0 [2] можно ознакомиться на GitHub.
С помощью аллокаторов программы на Rust получают память во время выполнения. Раньше Rust не позволял изменять способ распределения памяти, что ограничивало его использование в некоторых случаях. На одних платформах использовался jemalloc, на других — системный аллокатор, но пользователи не могли это контролировать. В выпуске 1.28.0 стабилизирован атрибут #[global_allocator]
, который позволяет программам на Rust выбирать системный аллокатор, а также определять новые аллокаторы, реализуя типаж GlobalAlloc
[3].
Аллокатор по умолчанию для Rust-программ на некоторых платформах — это jemalloc. Стандартная библиотека теперь предоставляет дескриптор системного аллокатора, который можно использовать для переключения на использование системного аллокатора, когда это необходимо, путем статического объявления с атрибутом #[global_allocator]
.
use std::alloc::System;
#[global_allocator]
static GLOBAL: System = System;
fn main() {
let mut v = Vec::new();
// Память будет выделяться системным аллокатором.
v.push(1);
}
Однако, иногда вам требуется определить собственный аллокатор для специфической функциональной области вашего приложения. Это тоже относительно легко сделать, реализовав типаж GlobalAlloc
. Подробнее о том, как это сделать, вы можете прочитать в документации [3].
Работа по улучшению диагностики продолжается, на этот раз с акцентом на форматирование:
format!("{_foo}", _foo = 6usize);
Раньше сообщение об ошибке в этом месте было довольно скудным:
error: invalid format string: expected `'}'`, found `'_'`
|
2 | format!("{_foo}", _foo = 6usize);
| ^^^^^^^^
Теперь новое диагностическое сообщение указывает конкретную причину, по которой строка формата недействительна:
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
Подробности смотрите в примечаниях к выпуску [2].
Кроме уже упомянутой стабилизации типажа GlobalAlloc
, в этом выпуске стабилизированы NonZero
[4] числовые типы. Это типы-обертки вокруг стандартных беззнаковых целочисленных типов: NonZeroU8
, NonZeroU16
, NonZeroU32
, NonZeroU64
, NonZeroU128
и NonZeroUsize
.
Они позволяют оптимизировать размер хранящихся данных. Например, Option<u8>
занимает два байта, тогда как Option<NonZeroU8>
— один. Обратите внимание, что эта оптимизация сохраняется даже тогда, когда NonZeroU8
завернут внутрь другой структуры; в примере ниже показано, что Door
по-прежнему занимает один байт, даже когда он помещен внутрь Option
. Эта оптимизация применима также и к перечислениям, определенным пользователем, Option
тут не является особенным.
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);
}
Также было стабилизировано множество других компонентов библиотеки, полный список которых вы найдете в подробных примечаниях к выпуску [2].
Cargo теперь не позволит вам публиковать пакеты со скриптами сборки, которые модифицируют каталог src. [5] Каталог src
в пакете следует считать неизменяемым.
Множество людей участвовало в разработке Rust 1.28. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо! [6]
От переводчика: выражаю отельную благодарность участникам сообщества ruRust и лично ozkriff [7] за помощь с переводом и вычиткой
Автор: Александр Мещеряков
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/288325
Ссылки в тексте:
[1] установить его: https://www.rust-lang.org/install.html
[2] подробными примечаниями к выпуску Rust 1.28.0: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1280-2018-08-02
[3] GlobalAlloc
: https://doc.rust-lang.org/stable/std/alloc/trait.GlobalAlloc.html
[4] NonZero
: https://doc.rust-lang.org/stable/std/num/index.html
[5] Cargo теперь не позволит вам публиковать пакеты со скриптами сборки, которые модифицируют каталог src.: https://github.com/rust-lang/cargo/pull/5584/
[6] Спасибо!: https://thanks.rust-lang.org/rust/1.28.0
[7] ozkriff: https://habr.com/users/ozkriff/
[8] Источник: https://habr.com/post/419259/?utm_source=habrahabr&utm_medium=rss&utm_campaign=419259
Нажмите здесь для печати.