Skip to content

Commit 89d2c86

Browse files
authored
Merge pull request #153 from rust-lang-ru/rust-1-95-0
Rust-1.95.0.md
2 parents db4a482 + 3427c2f commit 89d2c86

1 file changed

Lines changed: 140 additions & 0 deletions

File tree

Rust-1.95.0.md

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
2+
+++
3+
path = "2026/04/16/Rust-1.95.0"
4+
title = "Анонс Rust 1.95.0"
5+
authors = ["Команда выпуска Rust"]
6+
aliases = ["releases/1.95.0"]
7+
8+
[extra]
9+
release = true
10+
+++
11+
12+
Команда Rust рада объявить о новом выпуске Rust 1.95.0. Rust — это язык программирования, который дает каждому возможность создавать надежное и эффективное программное обеспечение.
13+
14+
Если у вас уже установлена предыдущая версия Rust через `rustup`, вы можете получить 1.95.0 командой:
15+
16+
```console
17+
$ rustup update stable
18+
```
19+
20+
Если у вас еще не установлен Rust, вы можете [получить `rustup`](https://www.rust-lang.org/install.html) на соответствующей странице нашего сайта, а также ознакомиться с [подробными примечаниями к выпуску 1.95.0](https://doc.rust-lang.org/stable/releases.html#version-1950-2026-04-16).
21+
22+
Если вы хотите помочь нам, тестируя будущие релизы, попробуйте локально переключиться на beta-канал (`rustup default beta`) или nightly-канал (`rustup default nightly`). Пожалуйста, [сообщайте](https://github.com/rust-lang/rust/issues/new/choose) о любых найденных ошибках!
23+
24+
## Что вошло в стабильный 1.95.0
25+
26+
### `cfg_select!`
27+
28+
В Rust 1.95 появилась
29+
макрокоманда [`cfg_select!`](https://doc.rust-lang.org/stable/std/macro.cfg_select.html),
30+
которая работает примерно как `match` на этапе компиляции по `cfg`. Она
31+
решает ту же задачу, что и популярный крейт
32+
[`cfg-if`](https://crates.io/crates/cfg-if), хотя и с другим синтаксисом.
33+
`cfg_select!` разворачивается в правую часть первой ветки, чей
34+
предикат конфигурации вычисляется в `true`. Несколько примеров:
35+
36+
```rust
37+
cfg_select! {
38+
unix => {
39+
fn foo() { /* функциональность только для unix */ }
40+
}
41+
target_pointer_width = "32" => {
42+
fn foo() { /* функциональность для не-unix, 32-бит */ }
43+
}
44+
_ => {
45+
fn foo() { /* резервная реализация */ }
46+
}
47+
}
48+
49+
let is_windows_str = cfg_select! {
50+
windows => "windows",
51+
_ => "not windows",
52+
};
53+
```
54+
55+
### if-let guards в match-выражениях
56+
57+
В Rust 1.88 были стабилизированы [цепочки let](https://blog.rust-lang.org/2025/06/26/Rust-1.88.0/#let-chains). В Rust
58+
1.95 эта возможность пришла и в `match`-выражения, позволяя задавать условия
59+
на основе сопоставления с образцом.
60+
61+
```rust
62+
match value {
63+
Some(x) if let Ok(y) = compute(x) => {
64+
// И `x`, и `y` доступны здесь
65+
println!("{}, {}", x, y);
66+
}
67+
_ => {}
68+
}
69+
```
70+
71+
Обратите внимание: сейчас компилятор не учитывает образцы, сопоставленные в `if
72+
let`-guards, как часть проверки полноты покрытия (`exhaustiveness`) всего `match`,
73+
так же как и в случае с обычными `if`-guards.
74+
75+
### Стабилизированные API
76+
77+
- [`MaybeUninit<[T; N]>: From<[MaybeUninit<T>; N]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-From%3CMaybeUninit%3C%5BT;+N%5D%3E%3E-for-%5BMaybeUninit%3CT%3E;+N%5D)
78+
- [`MaybeUninit<[T; N]>: AsRef<[MaybeUninit<T>; N]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsRef%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E)
79+
- [`MaybeUninit<[T; N]>: AsRef<[MaybeUninit<T>]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsRef%3C%5BMaybeUninit%3CT%3E%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E)
80+
- [`MaybeUninit<[T; N]>: AsMut<[MaybeUninit<T>; N]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsMut%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E)
81+
- [`MaybeUninit<[T; N]>: AsMut<[MaybeUninit<T>]>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsMut%3C%5BMaybeUninit%3CT%3E%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E)
82+
- [`[MaybeUninit<T>; N]: From<MaybeUninit<[T; N]>>`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-From%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E)
83+
- [`Cell<[T; N]>: AsRef<[Cell<T>; N]>`](https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E;+N%5D%3E-for-Cell%3C%5BT;+N%5D%3E)
84+
- [`Cell<[T; N]>: AsRef<[Cell<T>]>`](https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E%5D%3E-for-Cell%3C%5BT;+N%5D%3E)
85+
- [`Cell<[T]>: AsRef<[Cell<T>]>`](https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E%5D%3E-for-Cell%3C%5BT%5D%3E)
86+
- [`bool: TryFrom<{integer}>`](https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-TryFrom%3Cu128%3E-for-bool)
87+
- [`AtomicPtr::update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.update)
88+
- [`AtomicPtr::try_update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.try_update)
89+
- [`AtomicBool::update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicBool.html#method.update)
90+
- [`AtomicBool::try_update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicBool.html#method.try_update)
91+
- [`AtomicIn::update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicIsize.html#method.update)
92+
- [`AtomicIn::try_update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicIsize.html#method.try_update)
93+
- [`AtomicUn::update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicUsize.html#method.update)
94+
- [`AtomicUn::try_update`](https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicUsize.html#method.try_update)
95+
- [`cfg_select!`](https://doc.rust-lang.org/stable/std/macro.cfg_select.html)
96+
- [`mod core::range`](https://doc.rust-lang.org/stable/core/range/index.html)
97+
- [`core::range::RangeInclusive`](https://doc.rust-lang.org/stable/core/range/struct.RangeInclusive.html)
98+
- [`core::range::RangeInclusiveIter`](https://doc.rust-lang.org/stable/core/range/struct.RangeInclusiveIter.html)
99+
- [`core::hint::cold_path`](https://doc.rust-lang.org/stable/core/hint/fn.cold_path.html)
100+
- [`<*const T>::as_ref_unchecked`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_ref_unchecked)
101+
- [`<*mut T>::as_ref_unchecked`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_ref_unchecked-1)
102+
- [`<*mut T>::as_mut_unchecked`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_mut_unchecked)
103+
- [`Vec::push_mut`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.push_mut)
104+
- [`Vec::insert_mut`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.insert_mut)
105+
- [`VecDeque::push_front_mut`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.push_front_mut)
106+
- [`VecDeque::push_back_mut`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.push_back_mut)
107+
- [`VecDeque::insert_mut`](https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.insert_mut)
108+
- [`LinkedList::push_front_mut`](https://doc.rust-lang.org/stable/std/collections/struct.LinkedList.html#method.push_front_mut)
109+
- [`LinkedList::push_back_mut`](https://doc.rust-lang.org/stable/std/collections/struct.LinkedList.html#method.push_back_mut)
110+
- [`Layout::dangling_ptr`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.dangling_ptr)
111+
- [`Layout::repeat`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.repeat)
112+
- [`Layout::repeat_packed`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.repeat_packed)
113+
- [`Layout::extend_packed`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.extend_packed)
114+
115+
Эти API, ранее уже стабильные, теперь также стабильны в `const`-контекстах:
116+
117+
- [`fmt::from_fn`](https://doc.rust-lang.org/stable/std/fmt/fn.from_fn.html)
118+
- [`ControlFlow::is_break`](https://doc.rust-lang.org/stable/core/ops/enum.ControlFlow.html#method.is_break)
119+
- [`ControlFlow::is_continue`](https://doc.rust-lang.org/stable/core/ops/enum.ControlFlow.html#method.is_continue)
120+
121+
### Дестабилизированные JSON-спецификации целей
122+
123+
Rust 1.95 убирает в stable поддержку передачи пользовательской спецификации
124+
цели в `rustc`. Это **не должно** затронуть пользователей Rust, работающих с полностью stable
125+
toolchain, поскольку сборка стандартной библиотеки (включая только `core`) и так
126+
требовала возможностей, доступных только в nightly.
127+
128+
Мы также собираем сценарии использования пользовательских целей в [tracking issue](https://github.com/rust-lang/rust/issues/151528),
129+
пока решаем, стоит ли в будущем стабилизировать какую-либо форму этой функциональности.
130+
131+
### Другие изменения
132+
133+
Смотрите полный список изменений в [Rust](https://github.com/rust-lang/rust/releases/tag/1.95.0), [Cargo](https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-195-2026-04-16) и [Clippy](https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-195).
134+
135+
## Участники релиза 1.95.0
136+
137+
Над созданием Rust 1.95.0 работало много людей. Без вас это было бы невозможно. [Спасибо!](https://thanks.rust-lang.org/rust/1.95.0/)
138+
139+
[platform-support]: https://doc.rust-lang.org/rustc/platform-support.html
140+

0 commit comments

Comments
 (0)