Skip to content

Commit 4a11ca6

Browse files
gitlocalize-app[bot]funkillTelegaOvoshey
authored
Rust-1.89.0.md (#148)
* Translate Rust-1.89.0.md via GitLocalize * Update Rust-1.89.0.md --------- Co-authored-by: funkill <funkill2@gmail.com> Co-authored-by: TelegaOvoshey <Redeye.drd@gmail.com>
1 parent 655c982 commit 4a11ca6

1 file changed

Lines changed: 212 additions & 0 deletions

File tree

ru/announcements/Rust-1.89.0.md

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
Rust 1.89.0
2+
3+
[extra] release = true +++
4+
5+
Команда Rust рада сообщить о новой версии языка — 1.89.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
6+
7+
Если у вас есть предыдущая версия Rust, установленная через `rustup`, то для обновления до версии 1.89.0 вам достаточно выполнить команду:
8+
9+
```console
10+
$ rustup update stable
11+
```
12+
13+
Если у вас ещё не установлен `rustup`, вы можете установить его с [соответствующей страницы](https://www.rust-lang.org/install.html) нашего веб-сайта, а также посмотреть [подробные примечания к выпуску](https://doc.rust-lang.org/stable/releases.html#version-1890-2025-08-07) на GitHub.
14+
15+
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (`rustup default beta`) или nightly (`rustup default nightly`). Пожалуйста, [сообщайте](https://github.com/rust-lang/rust/issues/new/choose) обо всех встреченных вами ошибках.
16+
17+
## Что стабилизировано в 1.89.0
18+
19+
### Явный вывод аргументов для константных обобщений
20+
21+
Теперь Rust поддерживает использование `_` в качестве аргумента для константных обобщённых параметров, что позволяет выводить значение из окружающего контекста:
22+
23+
```rust
24+
pub fn all_false<const LEN: usize>() -> [bool; LEN] {
25+
[false; _]
26+
}
27+
```
28+
29+
Аналогично правилам, когда `_` разрешается в качестве типа, `_` не разрешается в качестве аргумента для константных обобщений в сигнатуре:
30+
31+
```rust
32+
// Так делать нельзя
33+
pub const fn all_false<const LEN: usize>() -> [bool; _] {
34+
[false; LEN]
35+
}
36+
37+
// И так тоже
38+
pub const ALL_FALSE: [bool; _] = all_false::<10>();
39+
```
40+
41+
### Проверка для несовпадающего синтаксиса времён жизни
42+
43+
[Сокращение времён жизни] в сигнатурах функций — это удобная особенность языка Rust, но она может стать камнем преткновения как для новичков, так и для опытных разработчиков. Это особенно заметно, когда времена жизни выводятся в типах, где синтаксически неочевидно их наличие:
44+
45+
```rust
46+
// Возвращаемый тип `std::slice::Iter` имеет время жизни,
47+
// но визуально это никак не показано.
48+
//
49+
// Сокращение времени жизни выводит, что время жизни
50+
// возвращаемого типа такое же, как у `scores`.
51+
fn items(scores: &[u8]) -> std::slice::Iter<u8> {
52+
scores.iter()
53+
}
54+
```
55+
56+
Подобный код теперь будет по умолчанию выдавать предупреждение:
57+
58+
```text
59+
warning: hiding a lifetime that's elided elsewhere is confusing
60+
--> src/lib.rs:1:18
61+
|
62+
1 | fn items(scores: &[u8]) -> std::slice::Iter<u8> {
63+
| ^^^^^ -------------------- the same lifetime is hidden here
64+
| |
65+
| the lifetime is elided here
66+
|
67+
= help: the same lifetime is referred to in inconsistent ways, making the signature confusing
68+
= note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
69+
help: use `'_` for type paths
70+
|
71+
1 | fn items(scores: &[u8]) -> std::slice::Iter<'_, u8> {
72+
| +++
73+
```
74+
75+
[Впервые] мы попытались улучшить эту ситуацию ещё в 2018 году в рамках группы проверок [`rust_2018_idioms`], но [сильный отклик] на проверку `elided_lifetimes_in_paths` показал, что она была слишком "грубым инструментом", так как выдавала предупреждения о временах жизни, которые не важны для понимания функции:
76+
77+
```rust
78+
use std::fmt;
79+
80+
struct Greeting;
81+
82+
impl fmt::Display for Greeting {
83+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
84+
// -----^^^^^^^^^ ожидаемый параметр времени жизни
85+
// Знание о том, что `Formatter` имеет время жизни, не помогает программисту
86+
"howdy".fmt(f)
87+
}
88+
}
89+
```
90+
91+
Затем мы поняли, что путаница, которую мы хотим устранить, возникает, когда:
92+
93+
1. Правила вывода сокращения времён жизни *связывают* входное время жизни с выходным;
94+
2. Синтаксически неочевидно, что время жизни существует.
95+
96+
В Rust есть два синтаксических элемента, которые указывают на существование времени жизни: `&` и `'`. Символ `'` подразделяется на выводимое время жизни `'_` и именованные времена жизни `'a`. Когда тип использует именованное время жизни, сокращение не будет выводить время жизни для этого типа. Используя эти критерии, мы можем выделить три группы:
97+
98+
Очевидно, что есть время жизни | Разрешено сокращение времени жизни | Примеры
99+
--- | --- | ---
100+
Нет | Да | `ContainsLifetime`
101+
Да | Да | `&T`, `&'_ T`, `ContainsLifetime<'_>`
102+
Да | Нет | `&'a T`, `ContainsLifetime<'a>`
103+
104+
Проверка `mismatched_lifetime_syntaxes` проверяет, принадлежат ли входные и выходные данные функции к одной и той же группе. Для примера выше `&[u8]` относится ко второй группе, а `std::slice::Iter<u8>` — к первой. Мы говорим, что времена жизни в первой группе являются *скрытыми*.
105+
106+
Поскольку времена жизни на входе и выходе принадлежат к разным группам, проверка выдаст предупреждение для этой функции, уменьшая путаницу относительно того, когда значение имеет значимое время жизни, которое не очевидно визуально.
107+
108+
Проверка `mismatched_lifetime_syntaxes` заменяет проверку `elided_named_lifetimes`, которая делала нечто похожее специально для именованных времён жизни.
109+
110+
Дальнейшая работа над проверкой `elided_lifetimes_in_paths` предполагает её разделение на более сфокусированные подпроверки с целью в конечном итоге начать выдавать предупреждения для их подмножества.
111+
112+
### Больше возможностей для целевых платформ x86
113+
114+
Атрибут `target_feature` теперь поддерживает функции `sha512`, `sm3`, `sm4`, `kl` и `widekl` для x86. Кроме того, на x86 также поддерживается ряд встроенных функций и возможностей `avx512`:
115+
116+
```rust
117+
#[target_feature(enable = "avx512bw")]
118+
pub fn cool_simd_code(/* .. */) -> /* ... */ {
119+
/* ... */
120+
}
121+
122+
```
123+
124+
### Кросс-компилируемые документационные тесты
125+
126+
Теперь документационные тесты будут запускаться при выполнении команды `cargo test --doc --target other_target`. Это может привести к поломкам, поскольку тесты, которые ранее не запускались и могли завершиться с ошибкой, теперь будут использованы.
127+
128+
Падающие тесты можно отключить, добавив к документационному тесту аннотацию `ignore-<target>` ([документация](https://doc.rust-lang.org/stable/rustdoc/write-documentation/documentation-tests.html#ignoring-targets)).
129+
130+
```rust
131+
/// ```ignore-x86_64
132+
/// panic!("something")
133+
/// ```
134+
pub fn my_function() { }
135+
```
136+
137+
### `i128` и `u128` в функциях `extern "C"`
138+
139+
Типы `i128` и `u128` теперь можно использовать в функциях `extern "C"` без предупреждения, поскольку они больше не вызывают проверку `improper_ctypes_definitions`. Однако есть несколько нюансов:
140+
141+
- Типы Rust ABI- и layout- совместимы с (беззнаковым) `__int128` в C, если этот тип доступен.
142+
- На платформах, где `__int128` недоступен, `i128` и `u128` не обязательно совпадают с каким-либо типом C.
143+
- `i128` *не* обязательно совместим с `_BitInt(128)` на любой платформе, поскольку `_BitInt(128)` и `__int128` могут иметь разный ABI (как, например, на x86-64).
144+
145+
Это последнее обновление, связанное [с прошлогодними изменениями в layout](https://blog.rust-lang.org/2024/03/30/i128-layout-update/).
146+
147+
### Понижение `x86_64-apple-darwin` до Tier 2 с инструментами хоста
148+
149+
GitHub скоро [прекратит] предоставлять бесплатные раннеры macOS x86_64 для публичных репозиториев. Apple также [анонсировала] свои планы по прекращению поддержки архитектуры x86_64.
150+
151+
В соответствии с этими изменениями, проект Rust находится в [процессе понижения таргета `x86_64-apple-darwin`] с [Tier 1 с инструментами хоста](https://doc.rust-lang.org/stable/rustc/platform-support.html#tier-1-with-host-tools) до [Tier 2 с инструментами хоста](https://doc.rust-lang.org/stable/rustc/platform-support.html#tier-2-with-host-tools). Это означает, что для этого таргета, включая такие инструменты, как `rustc` и `cargo`, будет гарантирована сборка, но не гарантируется прохождение нашего автоматизированного набора тестов.
152+
153+
Мы ожидаем, что RFC о понижении до Tier 2 с инструментами хоста будет принят между релизами Rust 1.89 и 1.90. Это означает, что Rust 1.89 будет последним релизом, где `x86_64-apple-darwin` является таргетом Tier 1.
154+
155+
Для пользователей это изменение не окажет немедленного влияния. Сборки как стандартной библиотеки, так и компилятора по-прежнему будут распространяться проектом Rust для использования через `rustup` или альтернативные методы установки, пока таргет остаётся в Tier 2. Но вероятно, что со временем уменьшение тестового покрытия для этого таргета приведёт к поломкам или потере совместимости без дополнительных объявлений.
156+
157+
### C ABI, соответствующий стандартам, для таргета `wasm32-unknown-unknown`
158+
159+
Функции `extern "C"` для таргета `wasm32-unknown-unknown` теперь имеют ABI, соответствующий стандартам. Подробнее об этом можно узнать [в этой статье](https://blog.rust-lang.org/2025/04/04/c-abi-changes-for-wasm32-unknown-unknown).
160+
161+
### Поддержка платформ
162+
163+
- [`x86_64-apple-darwin` находится в процессе понижения до Tier 2 с инструментами хоста](https://github.com/rust-lang/rfcs/pull/3841)
164+
- [Добавлены новые Tier-3 платформы `loongarch32-unknown-none<code data-md-type="codespan"> и <code data-md-type="codespan">loongarch32-unknown-none-softfloat`](https://github.com/rust-lang/rust/pull/142053)
165+
166+
Дополнительную информацию о уровнях поддержки платформ в Rust можно найти на [странице поддержки].
167+
168+
### Стабилизированные API
169+
170+
- [`NonZero<char>`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html)
171+
- Множество встроенных функций для x86, не перечисленных здесь:
172+
- [Встроенные функции AVX512](https://github.com/rust-lang/rust/issues/111137)
173+
- [Встроенные функции `SHA512`, `SM3` и `SM4`](https://github.com/rust-lang/rust/issues/126624)
174+
- [`File::lock`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.lock)
175+
- [`File::lock_shared`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.lock_shared)
176+
- [`File::try_lock`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.try_lock)
177+
- [`File::try_lock_shared`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.try_lock_shared)
178+
- [`File::unlock`](https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.unlock)
179+
- [`NonNull::from_ref`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.from_ref)
180+
- [`NonNull::from_mut`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.from_mut)
181+
- [`NonNull::without_provenance`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.without_provenance)
182+
- [`NonNull::with_exposed_provenance`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.with_exposed_provenance)
183+
- [`NonNull::expose_provenance`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.expose_provenance)
184+
- [`OsString::leak`](https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.leak)
185+
- [`PathBuf::leak`](https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.leak)
186+
- [`Result::flatten`](https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.flatten)
187+
- [`std::os::linux::net::TcpStreamExt::quickack`](https://doc.rust-lang.org/stable/std/os/linux/net/trait.TcpStreamExt.html#tymethod.quickack)
188+
- [`std::os::linux::net::TcpStreamExt::set_quickack`](https://doc.rust-lang.org/stable/std/os/linux/net/trait.TcpStreamExt.html#tymethod.set_quickack)
189+
190+
Следующие API теперь можно использовать в контексте <code>const</code>:
191+
192+
- [`<[T; N]>::as_mut_slice`](https://doc.rust-lang.org/stable/std/primitive.array.html#method.as_mut_slice)
193+
- [`<[u8]>::eq_ignore_ascii_case`](https://doc.rust-lang.org/stable/std/primitive.slice.html#impl-%5Bu8%5D/method.eq_ignore_ascii_case)
194+
- [`str::eq_ignore_ascii_case`](https://doc.rust-lang.org/stable/std/primitive.str.html#impl-str/method.eq_ignore_ascii_case)
195+
196+
### Прочие изменения
197+
198+
Проверьте всё, что изменилось в [Rust](https://github.com/rust-lang/rust/releases/tag/1.89.0), [Cargo](https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-189-2025-08-07) и [Clippy](https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-189).
199+
200+
## Кто работал над 1.89.0
201+
202+
Многие люди собрались вместе, чтобы создать Rust 1.89.0. Без вас мы бы не справились. [Спасибо!](https://thanks.rust-lang.org/rust/1.89.0/)
203+
204+
205+
[Сокращение времён жизни]: https://doc.rust-lang.org/1.89/book/ch10-03-lifetime-syntax.html#lifetime-elision
206+
[Впервые]: https://github.com/rust-lang/rust/pull/46254
207+
[`rust_2018_idioms`]: https://github.com/rust-lang/rust/issues/54910
208+
[сильный отклик]: https://github.com/rust-lang/rust/issues/131725
209+
[анонсировала]: https://en.wikipedia.org/wiki/Mac_transition_to_Apple_silicon#Timeline
210+
[прекратит]: https://github.blog/changelog/2025-07-11-upcoming-changes-to-macos-hosted-runners-macos-latest-migration-and-xcode-support-policy-updates/#macos-13-is-closing-down
211+
[процессе понижения таргета `x86_64-apple-darwin`]: https://github.com/rust-lang/rfcs/pull/3841
212+
[странице поддержки]: https://doc.rust-lang.org/rustc/platform-support.html

0 commit comments

Comments
 (0)