Команда Rust анонсирует релиз 1.18.
Обновление предыдущей версии легко:
$ rustup update stable
Сам rustup
можно установить здесь.
Основные изменения
Одно из главных изменений - новая версия «The Rust Programming Language», официального учебника по Rust. Он пишется открыто на Github, и имеет более ста авторов. В этом релизе включен черновик второй версии книги, имеющий 19 из 20 глав; двадцатая глава будет готова к релизу 1.19. Купить бумажную версию можно через No Starch Press. Новая версия книги полностью переписана и учитывает последние два года нашего опыта обучения Rust. Вы найдете новые объяснения основных принципов Rust, новые проекты и прочее.
В самом языке улучшено ключевое слово pub
. По умолчанию, в Rust объекты приватны; можно использовать pub
чтобы сделать их публичными. В Rust 1.18, pub
имеет новый вариант:
pub(crate) bar;
Слово в скобках - ограничение, контролирующее степень публичности объекта. Если указанно pub(crate)
, то bar
будет публичным для всего крейта (пакета), но не вне него. Это позволяет декларировать интерфейсы, «внутренне публичные» для пакета, но не доступные для внешних пользователей.
Также можно указать путь, например:
pub(in a::b::c) foo;
Это значит «доступно в иерархии a::b::c
, но не в прочих местах».
Для пользователей Windows Rust 1.18 имеет новый атрибут, #![windows_subsystem]
. Он работает так:
#![windows_subsystem(console)]
#![windows_subsystem(windows)]
Он контролирует флаг /SUBSYSTEM
в компоновщике. На текущий момент доступны только console
и windows
. Если вы разрабатываете графическое приложение, и не указываете windows
, в момент пуска программы всплывет окно консоли. С атрибутом windows
этого не произойдет.
Далее, в Rust кортежи, варианты перечисляемых типов и структуры (без атрибута #[repr]
) всегда имели неопределенное расположение в памяти. Мы включили автоматическое упорядочивание, которое может привести к уменьшению потребления памяти путем уменьшения необходимого выравнивания. Например:
struct Suboptimal(u8, u16, u8);
В прежних версиях Rust на платформе x86_64
эта структура имела бы размер в шесть байтов. Но согласно исходному коду, ей достаточно должно быть четырех. Остальные два байта - результат выравнивания. Поскольку мы имеем u16
, он требует двух байтов. Но в данном случае, он был смещен на один байт из-за предыдущего u8
. Для последнего же u8
требуется еще один байт выравнивая. В итоге, мы имеем 1 + 1 (пусто) + 2 + 1 + 1 (пусто) = 6 байтов.
Но что если структура выглядит так?
struct Optimal(u8, u8, u16);
Эта структура оптимально выравнена; u16
находится на рубеже двух байтов, как и остальная структура. Выравнивание не требуется. Это дает нам 1 + 1 + 2 = 4 байта.
При дизайне Rust мы оставили физическое расположение данных в памяти неопределенным как-раз по этой причине; любой safe
-код (не следующий по «сырым» указателям) не будет затронут подобной оптимизацией. Благодаря этому, мы можем научить компилятор оптимизировать Suboptimal
в Optimal
автоматически. В Rust 1.18 обе структуры занимают в памяти размер в четыре байта.
Мы долго планировали это изменение; оно было и ранее в нестабильной версии Rust, но некоторые программисты писали unsafe
-код, который предполагал определенное расположение данных в памяти. Если вам необходима гарантия, что физическое расположение в памяти в точности совпадает с расположением вариантов в исходном коде (например, при обращению к оболочкам Cи-кода), пометьте вашу структуру с атрибутом #[repr(C)]
.
Напоследок, улучшено время компиляции; например, компиляция самого rustc
теперь на 15%-20% быстрее.
Стабилизированы следующие библиотеки:
-
Child::try_wait
, неблокирующая формаChild::wait
. -
HashMap::retain
иHashSet::retain
- версия существующегоretain
отVec<T>
теперь и у этих двух структур. -
PeekMut::pop
позволяет взять ранее прочитанный верхний элемент отBinaryHeap<T>
без необходимости повторно упорядочивать кучу. -
TcpStream::peek
,UdpSocket::peek
,UdpSocket::peek_from
позволяют прочесть крайний элемент у потока или сокета.
Новый функционал Cargo
Cargo добавил поддержку системы управления версиями Pijul, который написан на Rust:
cargo new my-awesome-project --vcs=pijul
У Cargo несколько новых флагов, дополняющих --all
: --bins
, --examples
, --tests
и --benches
позволяют собрать все программы указанных типов.
И наконец, Cargo теперь поддерживает Haiku и Android.
Подробнее об изменениях написано здесь.
>>> Подробности