+++ path = "2026/04/16/Rust-1.95.0" title = "Анонс Rust 1.95.0" authors = ["Команда выпуска Rust"] aliases = ["releases/1.95.0"]
[extra] release = true +++
Команда 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). Пожалуйста, сообщайте о любых найденных ошибках!
В 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",
};В 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.
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::updateAtomicPtr::try_updateAtomicBool::updateAtomicBool::try_updateAtomicIn::updateAtomicIn::try_updateAtomicUn::updateAtomicUn::try_updatecfg_select!mod core::rangecore::range::RangeInclusivecore::range::RangeInclusiveItercore::hint::cold_path<*const T>::as_ref_unchecked<*mut T>::as_ref_unchecked<*mut T>::as_mut_uncheckedVec::push_mutVec::insert_mutVecDeque::push_front_mutVecDeque::push_back_mutVecDeque::insert_mutLinkedList::push_front_mutLinkedList::push_back_mutLayout::dangling_ptrLayout::repeatLayout::repeat_packedLayout::extend_packed
Эти API, ранее уже стабильные, теперь также стабильны в const-контекстах:
Rust 1.95 убирает в stable поддержку передачи пользовательской спецификации
цели в rustc. Это не должно затронуть пользователей Rust, работающих с полностью stable
toolchain, поскольку сборка стандартной библиотеки (включая только core) и так
требовала возможностей, доступных только в nightly.
Мы также собираем сценарии использования пользовательских целей в tracking issue, пока решаем, стоит ли в будущем стабилизировать какую-либо форму этой функциональности.
Смотрите полный список изменений в Rust, Cargo и Clippy.
Над созданием Rust 1.95.0 работало много людей. Без вас это было бы невозможно. Спасибо!