Pull to refresh

Rust 1.88.0: Цепочки let, naked-функции, булевы литералы в cfg и очистка кеша cargo

Level of difficultyEasy
Reading time4 min
Views684
Original author: The Rust Release Team

Команда 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



Следующие API теперь можно использовать в контексте const:



Прочие изменения


Как было объявлено ранее, уровень поддержки целевой платформы i686-pc-windows-gnu был понижен до Tier 2. Сейчас это не затронет пользователей, так как и компилятор, и стандартная библиотека поставляются через rustup для этой платформы. Однако без тестирования, которое было на Tier 1, становится больше шансов получить баги в будущем.


Проверьте всё, что изменилось в Rust, Cargo и Clippy.


Кто работал над 1.88.0


Многие люди собрались вместе, чтобы создать Rust 1.88.0. Без вас мы бы не справились. Спасибо!


От переводчиков


С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.

Tags:
Hubs:
+10
Comments1

Articles