Команда Rust рада сообщить о новой версии языка — 1.88.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.88.0 вам достаточно выполнить команду:
$ rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta
) или nightly (rustup default nightly
). Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Что стабилизировано в 1.88.0
Цепочки let
Эта функция позволяет объединять let
-выражения с помощью &&
в условиях if
и while
даже смешивая их с булевыми выражениями. Таким образом уменьшается различие между if
/if let
и while
/while let
. Шаблоны внутри let
-подвыражений могут быть неопровержимыми или опровержимыми, а привязки доступны и в теле, и в последующих частях цепочки.
Например, этот фрагмент объединяет несколько условий, которые ранее потребовали бы вложенности блоков if let
и if
:
if let Channel::Stable(v) = release_info()
&& let Semver { major, minor, .. } = v
&& major == 1
&& minor == 88
{
println!("`let_chains` стабилизированы в этой версии");
}
let
-цепочки доступны только в редакции Rust 2024, поскольку эта функция зависит от изменения временной области видимости if let
для более согласованного порядка удаления.
Предыдущие попытки работали со всеми редакциями, но некоторые пограничные случаи угрожали целостности реализации. Редакция 2024 сделала это возможным, поэтому, пожалуйста, обновите редакцию вашего крейта, если хотите использовать эту функцию!
Naked-функции
Rust теперь поддерживает написание naked-функций без генерируемого компилятором пролога и эпилога, что даёт полный контроль над сгенерированным ассемблерным кодом для конкретной функции. Это более эргономичная альтернатива определению функций в блоке global_asm!
. Naked-функция помечается атрибутом #[unsafe(naked)]
, а её тело состоит из единственного вызова naked_asm!
.
Например:
#[unsafe(naked)]
pub unsafe extern "sysv64" fn wrapping_add(a: u64, b: u64) {
// Эквивалентно `a.wrapping_add(b)`.
core::arch::naked_asm!(
"add rax, rdi, rsi",
"ret"
);
}
Блок ассемблерного кода, написанный вручную, определяет всё тело функции: в отличие от обычных функций, компилятор не добавляет специальной обработки для аргументов или возвращаемых значений. Naked-функции используются в низкоуровневых сценариях, таких как compiler-builtins
, операционные системы и встраиваемые приложения.
Ожидайте более подробную публикацию об этом в ближайшее время!
Булевы литералы в cfg
Язык, используемый в предикатах cfg
, теперь поддерживает булевы литералы true
и false
, действующие как конфигурации, которые всегда включены или выключены соответственно. Это работает в условной компиляции Rust с атрибутами cfg
и cfg_attr
, а также со встроенным макросом cfg!
. Кроме того, это работает в таблицах [target]
Cargo как в конфигурации, так и в манифестах.
Ранее для безусловной конфигурации можно было использовать пустые списки предикатов, такие как cfg(all())
для включения и cfg(any())
для выключения. Однако это значение было довольно неявным и легко могло запутать. Теперь cfg(true)
и cfg(false)
предлагают более явный способ выразить то, что вы имеете в виду.
Более подробную информацию смотрите в RFC 3695!
Cargo теперь автоматически очищает кеш
Начиная с версии 1.88.0, Cargo будет автоматически запускать сборщик мусора для кэша в домашней директории!
При сборке проектов Cargo загружает и кэширует крейты, необходимые в качестве зависимостей. Исторически сложилось так, что эти загруженные файлы никогда не удалялись, что приводило к неограниченному росту использования дискового пространства в домашней директории Cargo. В этой версии Cargo представляет механизм сборки мусора для автоматической очистки старых файлов (например, файлов .crate
). Cargo будет удалять файлы, загруженные по сети, если к ним не обращались в течение 3 месяцев, и файлы, полученные локально, если не было обращений в течение 1 месяца. Обратите внимание, что автоматическая сборка мусора не будет производиться, если Cargo работает в офлайн-режиме (с использованием флагов --offline
или --frozen
).
Cargo версии 1.78 и новее отслеживает информацию о доступе, необходимую для сборщика мусора. Это было внедрено задолго до включения фактической очистки, которая добавляется сейчас, чтобы уменьшить износ кэша для тех, кто всё ещё использует более ранние версии. Если вы регулярно используете версии Cargo старше 1.78 в дополнение к текущим версиям Cargo и ожидаете, что к некоторым крейтам будут обращаться исключительно старые версии Cargo, а также не хотите повторно загружать эти крейты каждые ~3 месяца, вы можете установить cache.auto-clean-frequency = "never"
в конфигурации Cargo, как описано в документации.
Для получения более подробной информации смотрите оригинальный анонс этой функции. Некоторые части этого дизайна остаются нестабильными, например подкоманда gc
, отслеживаемая в cargo#13060, так что впереди ещё много интересного!
Стабилизированные API
Cell::update
impl Default for *const T
impl Default for *mut T
mod ffi::c_str
HashMap::extract_if
HashSet::extract_if
hint::select_unpredictable
proc_macro::Span::line
proc_macro::Span::column
proc_macro::Span::start
proc_macro::Span::end
proc_macro::Span::file
proc_macro::Span::local_file
<[T]>::as_chunks
<[T]>::as_rchunks
<[T]>::as_chunks_unchecked
<[T]>::as_chunks_mut
<[T]>::as_rchunks_mut
<[T]>::as_chunks_unchecked_mut
Следующие API теперь можно использовать в контексте const
:
NonNull<T>::replace
<*mut T>::replace
std::ptr::swap_nonoverlapping
Cell::replace
Cell::get
Cell::get_mut
Cell::from_mut
Cell::as_slice_of_cells
Прочие изменения
Как было объявлено ранее, уровень поддержки целевой платформы i686-pc-windows-gnu
был понижен до Tier 2. Сейчас это не затронет пользователей, так как и компилятор, и стандартная библиотека поставляются через rustup
для этой платформы. Однако без тестирования, которое было на Tier 1, становится больше шансов получить баги в будущем.
Проверьте всё, что изменилось в Rust, Cargo и Clippy.
Кто работал над 1.88.0
Многие люди собрались вместе, чтобы создать Rust 1.88.0. Без вас мы бы не справились. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.