Rust 1.18

Команда 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
теперь и у этих двух структур.PeekMut::pop
позволяет взять ранее прочитанный верхний элемент отBinaryHeap
без необходимости повторно упорядочивать кучу.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.
Более детальные изменения доступны здесь.
>>> Подробности