Команда Rust рада сообщить о новой версии языка — 1.72.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.72.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta
) или nightly (rustup default nightly
) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Что стабилизировано в 1.72.0
Rust сообщает в ошибках о потенциально полезных элементах, отключенных при помощи cfg
Вы можете включить Rust-код, используя cfg
— например, для предоставления некоторых функций только с определёнными возможностями крейтов или только на определённых платформах. Ранее отключенные таким образом элементы были бы фактически невидимы для компилятора. Однако теперь компилятор запоминает названия и cfg-условия
этих элементов, поэтому может, например, сообщать о функциях, которые вы пытались вызвать, но которые оказались недоступны, потому что были отключены в крейте.
Compiling my-project v0.1.0 (/tmp/my-project)
error[E0432]: unresolved import `rustix::io_uring`
--> src/main.rs:1:5
|
1 | use rustix::io_uring;
| ^^^^^^^^^^^^^^^^ no `io_uring` in the root
|
note: found an item that was configured out
--> /home/username/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-0.38.8/src/lib.rs:213:9
|
213 | pub mod io_uring;
| ^^^^^^^^
= note: the item is gated behind the `io_uring` feature
For more information about this error, try `rustc --explain E0432`.
error: could not compile `my-project` (bin "my-project") due to previous error
Константные вычисления теперь неограниченны
Чтобы защитить пользовательский константный код от попадания в вечный цикл или любого другого бесконечного события во время компиляции, Rust ранее ограничивал максимальное количество инструкций, выполняемых как часть любого константного вычисления. Однако особенно креативный код Rust может выйти за эти пределы и привести к ошибке компилятора. Хуже того — то, достигает ли код предела, может сильно варьироваться в зависимости от библиотек, вызываемых пользователем. Если библиотека, которую вы вызвали, разделит инструкцию на две в рамках одной из своих функций, ваш код может не скомпилироваться вовсе.
Теперь вы можете выполнять неограниченное количество константных вычислений во время компиляции. Чтобы избежать длительной компиляции без обратной связи, компилятор всегда будет выдавать сообщение после того, как ваш код будет запущен, и повторять это сообщение через некоторый промежуток времени, который каждый раз будет удваиваться. По умолчанию компилятор также вызывает проверку deny-by-default (const_eval_long_running
) после большого количества шагов, чтобы перехватить бесконечные циклы, но вы можете разрешить особенно длинное константное вычисление при помощи allow(const_eval_long_running)
.
Проверки Clippy, перешедшие в компилятор
Некоторые проверки перешли из Clippy в rustc
:
clippy::undropped_manually_drops
вundropped_manually_drops
(deny)
ManuallyDrop
не удаляет внутреннее значение, так что вызовstd::mem::drop
ничего не даст. Вместо этого проверка предложит сначала вызватьManuallyDrop::into_inner
или использоватьManuallyDrop::drop
для вызова деструктора. По умолчанию эта запрещающая проверка включена.
clippy::invalid_utf8_in_unchecked
вinvalid_from_utf8_unchecked
(deny) иinvalid_from_utf8
(warn)
- Первая проверка проверяет использование
std::str::from_utf8_unchecked
иstd::str::from_utf8_unchecked_mut
с невалидными UTF-8 литералами, что нарушает их предварительные условия безопасности, приводя к неопределённому поведению. По умолчанию этот параметр запрещён. - Вторая проверка используется для вызовов
std::str::from_utf8
иstd::str::from_utf8_mut
с невалидными UTF-8 литералами, которые всегда будут возвращать ошибку. По умолчанию это предупреждение.
- Первая проверка проверяет использование
clippy::cmp_nan
вinvalid_nan_comparisons
(warn)
- Эта проверка для сравнений, где в качестве одного операнда стоит
f32::NAN
илиf64::NAN
.NaN
ни с чем осмысленно не сравнивается — даже с самим собой, — поэтому эти сравнения всегда ложны. Эта проверка по умолчанию является предупреждением и предлагает использовать методis_nan()
.
- Эта проверка для сравнений, где в качестве одного операнда стоит
clippy::cast_ref_to_mut
вinvalid_reference_casting
(allow)
- Здесь проверяется преобразование
&T
в&mut T
без использования внутренней изменяемости, что является неопределённым поведением, даже если ссылка не используется. Сейчас по умолчанию эта проверка разрешающая, так как могут быть ложные срабатывания, но после улучшений в 1.73 она станет ошибкой.
- Здесь проверяется преобразование
Стабилизированные API
Следующие API теперь возможно использовать в контексте const
:
Прочие изменения
Проверьте всё, что изменилось в Rust, Cargo и Clippy.
Изменения минимально поддерживаемой версии Windows
В будущем выпуске мы планируем поднять минимально поддерживаемую версию Windows до 10. Принятое в компиляторе предложение MCP 651 заключается в том, что Rust 1.75 будет последней версией, официально поддерживающей Windows 7, 8, и 8.1. Когда в феврале 2024 года выйдет Rust 1.76, он будет поддерживать только Windows 10 и более поздние версии как целевые платформы первого уровня поддержки.
Участники 1.72.0
Многие люди собрались вместе, чтобы создать Rust 1.72.0. Без вас мы бы не справились. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Данную статью совместными усилиями перевели TelegaOvoshey и funkill.