Rust 1.95: макрос cfg_select!, if-let в guard-ах и конец кастомных JSON-таргетов на stable

Команда Rust выпустила 1.95.0. В язык завезли cfg_select! вместо крейта cfg-if и if-let прямо в guard-ах match. Заодно тихо убрали поддержку кастомных JSON-таргетов на стабильном компиляторе.

DB
DBG · по материалам Rust Blog
0

16 апреля вышел Rust 1.95.0 — очередной релиз из шестинедельного цикла, но с парой изменений, которые заметит почти каждый, кто пишет на Rust что-то сложнее скрипта.

Первое — макрос cfg_select!. По сути это компайл-таймовый match по конфигурационным флагам: пишешь ветки под разные платформы и фичи в одном блоке вместо лестницы из #[cfg(...)]. Ровно ту же задачу годами решал внешний крейт cfg-if, теперь она закрывается стандартной библиотекой, пусть и с другим синтаксисом. Для типичного проекта это минус одна зависимость в Cargo.toml.

Второе — if-let guards в match. Это логичное продолжение let-цепочек, которые стабилизировали ещё в 1.88: теперь в guard-условии ветки можно не просто проверить предикат, но и распаковать значение по паттерну и тут же им воспользоваться. Код, где раньше приходилось городить вложенный match или заранее вычислять Option, схлопывается в одну ветку.

Список стабилизированных API привычно длинный: конверсии массивов MaybeUninit (From, AsRef, AsMut), доступ к массивам через Cell, bool::TryFrom для целочисленных типов, методы update/try_update у AtomicPtr, AtomicBool и других атомиков, as_ref_unchecked и as_mut_unchecked у сырых указателей, мутирующие push_mut и insert_mut у коллекций, хелперы Layout (dangling_ptr, repeat, extend_packed), плюс поддержка const-контекста для fmt::from_fn и методов ControlFlow.

Что делать практикующему разработчику. Обновляться безопасно: rustup update stable, ломающих изменений в языке нет. Но есть одна мина — кастомные JSON-спецификации таргетов больше не работают на stable, их дестабилизировали. Если вы собираете под экзотическую железку или свою embedded-платформу через собственный target.json, стабильный компилятор после апдейта просто откажется это делать. Проверьте свои сборочные скрипты на наличие --target ./что-то.json до того, как обновите CI: вариантов два — переезжать на nightly или брать один из встроенных таргетов. Для всех остальных релиз чисто аддитивный, и push_mut стоит взять на вооружение сразу: он возвращает &mut на только что добавленный элемент, избавляя от повторной индексации после push.

Комментарии

Rust 1.95: макрос cfg_select!, if-let в guard-ах и конец кастомных JSON-таргетов на stable | DBG