|
| 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