Rust 1.95.0: макрос cfg_select!, if-let guards в match-выражениях

от автора

Команда Rust рада объявить о новом выпуске Rust 1.95.0. Rust — это язык программирования, который дает каждому возможность создавать надежное и эффективное программное обеспечение.

Если у вас уже установлена предыдущая версия Rust через rustup, вы можете получить 1.95.0 командой:

$ rustup update stable

Если у вас еще не установлен Rust, вы можете получить rustup на соответствующей странице нашего сайта, а также ознакомиться с подробными примечаниями к выпуску 1.95.0.

Если вы хотите помочь нам, тестируя будущие релизы, попробуйте локально переключиться на beta-канал (rustup default beta) или nightly-канал (rustup default nightly). Пожалуйста, сообщайте о любых найденных ошибках!

Что вошло в стабильный 1.95.0

cfg_select!

В Rust 1.95 появилась макрокоманда cfg_select!, которая работает примерно как match на этапе компиляции по cfg. Она решает ту же задачу, что и популярный крейт cfg-if, хотя и с другим синтаксисом. cfg_select! разворачивается в правую часть первой ветки, чей предикат конфигурации вычисляется в true. Несколько примеров:

cfg_select! {    unix => {        fn foo() { /* функциональность только для unix */ }    }    target_pointer_width = "32" => {        fn foo() { /* функциональность для не-unix, 32-бит */ }    }    _ => {        fn foo() { /* резервная реализация */ }    }}let is_windows_str = cfg_select! {    windows => "windows",    _ => "not windows",};

if-let guards в match-выражениях

В Rust 1.88 были стабилизированы цепочки let. В Rust 1.95 эта возможность пришла и в match-выражения, позволяя задавать условия на основе сопоставления с образцом.

match value {    Some(x) if let Ok(y) = compute(x) => {        // И `x`, и `y` доступны здесь        println!("{}, {}", x, y);    }    _ => {}}

Обратите внимание: сейчас компилятор не учитывает образцы, сопоставленные в if let-guards, как часть проверки полноты покрытия (exhaustiveness) всего match, так же как и в случае с обычными if-guards.

Стабилизированные API

Эти API, ранее уже стабильные, теперь также стабильны в const-контекстах:

Дестабилизированные JSON-спецификации целей

Rust 1.95 убирает в stable поддержку передачи пользовательской спецификации цели в rustc. Это не должно затронуть пользователей Rust, работающих с полностью stable toolchain, поскольку сборка стандартной библиотеки (включая только core) и так требовала возможностей, доступных только в nightly.

Мы также собираем сценарии использования пользовательских целей в tracking issue, пока решаем, стоит ли в будущем стабилизировать какую-либо форму этой функциональности.

Другие изменения

Смотрите полный список изменений в Rust, Cargo и Clippy.

Участники релиза 1.95.0

Над созданием Rust 1.95.0 работало много людей. Без вас это было бы невозможно. Спасибо!

ссылка на оригинал статьи https://habr.com/ru/articles/1024620/