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

  • MaybeUninit<[T; N]>: From<[MaybeUninit<T>; N]>

  • MaybeUninit<[T; N]>: AsRef<[MaybeUninit<T>; N]>

  • MaybeUninit<[T; N]>: AsRef<[MaybeUninit<T>]>

  • MaybeUninit<[T; N]>: AsMut<[MaybeUninit<T>; N]>

  • MaybeUninit<[T; N]>: AsMut<[MaybeUninit<T>]>

  • [MaybeUninit<T>; N]: From<MaybeUninit<[T; N]>>

  • Cell<[T; N]>: AsRef<[Cell<T>; N]>

  • Cell<[T; N]>: AsRef<[Cell<T>]>

  • Cell<[T]>: AsRef<[Cell<T>]>

  • bool: TryFrom<{integer}>

  • AtomicPtr::update

  • AtomicPtr::try_update

  • AtomicBool::update

  • AtomicBool::try_update

  • AtomicIn::update

  • AtomicIn::try_update

  • AtomicUn::update

  • AtomicUn::try_update

  • cfg_select!

  • mod core::range

  • core::range::RangeInclusive

  • core::range::RangeInclusiveIter

  • core::hint::cold_path

  • <*const T>::as_ref_unchecked

  • <*mut T>::as_ref_unchecked

  • <*mut T>::as_mut_unchecked

  • Vec::push_mut

  • Vec::insert_mut

  • VecDeque::push_front_mut

  • VecDeque::push_back_mut

  • VecDeque::insert_mut

  • LinkedList::push_front_mut

  • LinkedList::push_back_mut

  • Layout::dangling_ptr

  • Layout::repeat

  • Layout::repeat_packed

  • Layout::extend_packed

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

  • fmt::from_fn

  • ControlFlow::is_break

  • ControlFlow::is_continue

Дестабилизированные 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/


Интересные статьи

Интересные статьи

Выручка восьми крупнейших российских разработчиков систем автоматизированного проектирования (САПР) в 2024 году достигла почти 15 млрд рублей — это почти в три раза превышает анало...
Российский сервис управления бизнес‑процессами «Битрикс24» представил новую версию собственной ИИ‑модели — BitrixGPT 4x, созданную для упрощения выполнения повседневных задач пользователями....
Привет! Меня зовут Сергей, я немножко ведущий фронтенд-разработчик и немножко продуктовый менеджер, а еще друг, поэт и музыкант. Как так получилось — история для другой статьи, а здесь я расскажу...
Как ускорить 1С БИТРИКС и снизить кол-во запросов к БД используя ядро D7.Пример выборки элементов IBlock с пользовательскими свойствами в один запрос.
Реализация ORM в ядре D7 — очередная интересная, перспективная, но как обычно плохо документированная разработка от 1с-Битрикс :) Призвана она абстрагировать разработчика от механики работы с табл...