Выпуск Rust 1.36.0: Трейт Future, стабилизация alloc и MaybeUninit<T>
Представляю вашему вниманию перевод публикации о новой версии всеми любимого языка программирования Rust.
36. Команда по разработке языка программирования Rust рада анонсировать новую версию, 1. Rust — это язык программирования, позволяющий каждому разрабатывать надёжное и быстрое ПО. 0.
Если предыдущую версию Rust вы установили средствами rustup
, получение текущей версии не составит особого труда:
$ rustup update stable
Детальный обзор данного релиза доступен на GitHub. Если у Вас всё ещё нет rustup
, Вы можете получить его с соответствующей страницы на нашем сайте.
Данный релиз привнёс множество изменений, включая стабилизацию долгожданного трейта Future
, крейта alloc
, структуры MaybeUninit<T>
, NLL для Rust 2015
, новую реализацию HashMap<K, V>
и поддержку флага --offline
в Cargo.
Ниже описаны наиболее значительные изменения, однако вы также можете посмотреть детальный список нововведений для дополнительной осведомлённости.
36. Rust 1. 0 стабилизировал долгожданный трейт Future
!
Мы надеемся, что это нововведение позволит популярным крейтам, библиотекам, и, в целом, всей экосистеме подготовиться к синтаксису async
/.await
, стабилизация которого планируется на недалёкое будущее.
36. До версии 1. Крейт core
имел базовую функциональность (такую как Iterator
и Copy
) и мог быть использован в средах с #![no_std]
, так как он не налагал никаких требований. 0, стандартная библиотека состояла из крейтов std
, core
и proc_macro
. Между тем, крейт std
поставлял такие типы, как Box<T>
, а также функциональность операционной системы (глобальный аллокатор).
36. Начиная с Rust 1. Крейт std
, тем временем, реэкспортирует данные части.
0, части крейта std
, зависимые от глобального аллокатора, например, Vec, сейчас доступны в крейте alloc
.
В то время как программы с #![no_std]
, использующие крейт alloc
, всё ещё требуют канала nightly
, библиотеки с #![no_std]
могут использовать крейт alloc
в стабильном Rust.
Мы надеемся, что это будет содействовать разработке экосистемы, совместимой с #![no_std]
. Также отметим, что все "обычные" программы (без #![no_std]
) в своих зависимостях способны содержать описанные выше библиотеки с #![no_std]
.
Если вы являетесь разработчиком библиотеки, требующей примитивы аллокации для функционирования, советуем пометить свою библиотеку как совместимой с #![no_std]
, используя следующий синтаксис в начале файла lib.rs
:
#![no_std] extern crate alloc; use alloc::vec::Vec;
Одно из использований данной функции была "ленивая" аллокация массивов. В предыдущих релизах Rust, функция mem::uninitialized
разрешала вам отменять проверки инициализации, так как полагала, что вы УЖЕ выполнили инициализацию типа T
, не делая ничего.
Однако mem::uninitalized
является чрезмерно опасной операцией, которая не может быть правильно использована с компилятором Rust, предполагающим, что все значения проинициализированы должным образом.
Например, вызов mem::uninitialized::<bool>()
немедленно вызовет неопределённое поведение, так как с точки зрения Rust, неинициализированные биты являются либо нулём (false
), либо единицей (true
), и лишь два вышеописанных паттерна подходят для типа bool
.
36. Чтобы разрешить данную ситуацию, в Rust 1. Компилятор Rust теперь не предполагает, что MaybeUninit<T>
является инициализированным типом T
. 0 был стабилизирован тип MaybeUninit<T>
. Тем самым, вы можете выполнять постепенную инициализацию более безопасно и наконец-то использовать .assume_init()
когда вы уверены, что maybe_t: MaybeUninit<T>
содержит инициализированный тип T
.
38, функция mem::uninitialized
будет помечена устаревшей. Так как MaybeUninit<T>
является более безопасной альтернативой, начиная с Rust 1.
Стандартная библиотека также содержит достаточную документацию о MaybeUninit<T>
. Чтобы узнать больше о неинициализированной памяти, mem::uninitialized
и MaybeUninit<T>
, почитайте статью Алексиса Бессесснера.
31. В объявлении о Rust 1. Например, теперь вы можете написать так: 0 мы рассказали вам о NLL (нелексические лайфтаймы), нововведении в язык, делающим проверятеля ссылок (borrow checker) умнее и дружелюбнее.
fn main() { let mut x = 5; let y = &x; let z = &mut x; // Не было разрешено до 1.31.0
}
31. В 1. Это было сделано в Rust 1. 0, NLL был стабилизирован только для Rust 2018, и предполагалось, что мы перенесём его в Rust 2015 в будущем. 0, NLL стал доступным для Rust 2015. 36.
Однако старый проверятель ссылок, к сожалению, принял некорректный код, который он НЕ должен был принять. С NLL, поддерживаемым в обеих версиях, мы приближаемся к удалению старого проверятеля ссылок.
Советуем взглянуть на список пострадавших публичных крейтов. И, как результат, NLL сейчас находится на стадии "миграции", в которой мы будем выдавать предупреждения вместо ошибок в том случае, если проверятель ссылок NLL не одобрит код, который бы одобрил старый проверятель ссылок на основе AST.
Чтобы узнать больше о NLL, MIR, истории о правке "беззвучных дыр", и о том, что вы можете сделать с предупреждениями компилятора, прочтите статью Феликса Клока.
36. В Rust 1. Интерфейс остался прежним, но нынешняя реализация в среднем быстрее и потребляет меньше памяти. 0, предыдущая реализация HashMap<K, V>
была заменена реализацией из крейта hashbrown
, основанной на дизайне SwissTable. Однако заметьте, что стандартная реализация всё ещё использует алгоритм SipHash 1-3.
Однако, в некоторых моментах, например, когда новая зависимость была добавлена, Cargo всё-же будет пытаться получить доступ к сети. Во время большинства сборок, Cargo не использует вашу сеть. Иногда такое поведение недопустимо (в изолированной системе или в самолёте).
36. В Rust 1. Данный флаг отменяет алгоритм разрешения зависимостей, вместо этого используя локальные закешированные зависимости. 0, новый флаг --offline
был стабилизирован.
Чтобы предварительно заполнить локальный кеш до ухода из сети, используйте команду cargo fetch
, загружающую все необходимые зависимости для конкретного проекта. Если запрашиваемые крейты недоступны без сети, которая была отключена, то Cargo завершит работу с ошибкой.
Другие изменения в Cargo детально описаны тут. Чтобы узнать больше о --offline
и cargo fetch
, прочтите статью Ника Камерона.
-
Макрос
dbg!
стал поддерживать множественные аргументы; -
Некоторые методы были помечены словом
const
: -
Стабилизированы некоторые API, включая:
36. Подробные описания изменений в версии 1. 0 доступны для Rust, стандартной библиотеки, Cargo и Clippy.
36. Множество людей собрались вместе, чтобы создать Rust 1. Мы не смогли бы сделать это без всех вас, спасибо! 0.
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов.