Как стать автором
Обновить

Rust 1.70.0: протокол ''sparse'' для crates.io, OnceCell и OnceLock, лейблы отладочной информации

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров4.5K
Автор оригинала: The Rust Release Team

Команда Rust рада сообщить о новой версии языка — 1.70.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.70.0 вам достаточно выполнить команду:


rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.


Что стабилизировано в 1.70.0


Протокол 'sparse' по умолчанию для crates.io


Протокол 'sparse' Cargo теперь включён по умолчанию для чтения индекса из crates.io. Ранее эта функция была стабилизирована в Rust 1.68.0, но для её использования с crates.io по прежнему требовалась настройка. Мы обещали, что это поведение будет использоваться по умолчанию в версии 1.70.0 — и вот оно!


Вы увидите существенное повышение производительности при извлечении информации из индекса crates.io. Пользователям, ограниченным фаерволом, необходимо будет убедиться, что https://index.crates.io доступен. Если по какой-либо причине вам нужно сохранить предыдущие настройки по умолчанию с использованием git-индекса c GitHub, вы можете использовать параметр конфигурации registries.crates-io.protocol для изменения используемого протокола.


Побочный эффект изменения метода доступа в том, что изменяется также и путь к кэшу пакетов — и все зависимости загружаются заново. Как только вы полностью перейдёте к использованию протокола 'sparse', вы сможете удалить старый кэш $CARGO_HOME/registry/*/github.com-*.


OnceCell и OnceLock


Два новых типа были стабилизированы для единовременной инициализации совместно используемых данных: OnceCell и его потокобезопасный аналог OnceLock. Они могут быть использованы везде, где немедленное создание нежелательно или даже невозможно, например, не-const данные в глобальных переменных.


use std::sync::OnceLock;

static WINNER: OnceLock<&str> = OnceLock::new();

fn main() {
    let winner = std::thread::scope(|s| {
        s.spawn(|| WINNER.set("thread"));

        std::thread::yield_now(); // дайте им шанс...

        WINNER.get_or_init(|| "main")
    });

    println!("{winner} победил!");
}

Такие пакеты, как lazy_static и once_cell, в прошлом удовлетворяли эту потребность, но теперь они являются частью стандартной библиотеки, перенесённой из once_cell в модули unsync и sync. Есть ещё методы, которые могут быть стабилизированы в будущем, а также сопутствующие типы LazyCell и LazyLock, которые сохраняют свою инициализирующую функцию, но этот первый шаг в стабилизации уже должен охватывать множество вариантов использования.


IsTerminal


Этот недавно стабилизированный трейт имеет единственный метод is_terminal для определения того, является ли реализация файловым дескриптором или же дескриптором терминала или TTY. Это ещё один случай стандартизации функционала, существовавшего во внешних пакетах, например atty и is-terminal, использующих функции библиотеки C isatty в целевых системах Unix, а также в других местах. Этот функционал часто используется в программах, которые должны различать, где проходит запуск — в скриптах или интерактивных режимах, например для представления цветов или даже полного TUI в интерактивном режиме.


use std::io::{stdout, IsTerminal};

fn main() {
    let use_color = stdout().is_terminal();
    // если так, добавляем коды цветов в вывод приложения...
}

Именованные ярлыки отладочной информации


Опция компилятора -Cdebuginfo ранее поддерживала только числа 0..=2 для увеличения объёма отладочной информации, где Cargo по умолчанию использовал 2 в профилях dev и test и 0 в профилях release и bench. Эти уровни отладки теперь имеют имена «none» (0), «limited» (1) и «full» (2). Также появилось два новых уровня: «line-directives-only» и «line-tables-only».


Документация Cargo и rustc ранее называла уровень 1 «line tables only», но не содержала информации о типах и переменных — только информацию обо всех функциях. Этот уровень теперь называется «limited», а новый уровень «line-tables-only» усечён до минимума, необходимого для обратных трассировок с именами файлов и номерами строк. В конечном итоге это может стать уровнем, используемым для -Cdebuginfo=1. Другой уровень line-directives-only предназначен для профилирования NVPTX и не рекомендуется для использования в других случаях.


Обратите внимание, что именованные опции недоступны для использования в Cargo.toml. Их поддержка запланирована на следующий выпуск, 1.71.


Принудительная стабилизация в test CLI


Когда функции #[test] скомпилированы, исполняемый файл получает интерфейс командной строки из пакета test. Этот CLI имеет несколько опций, включая ещё нестабильные и требующие указания -Zunstable-options (как и многие другие команды в наборе инструментов Rust). Однако хоть и предполагается, что использование этой опции разрешено только в ночных сборках, это ограничение до сих пор не было активным в test. Начиная с версии 1.70.0, stable и beta-версии Rust больше не будут позволять использовать нестабильные параметры при запуске тестов, что приводит эти опции в соответствие с документацией и делает их возможными только в nightly-сборках.


Известны случаи, когда нестабильные параметры могли использоваться без ведома пользователя, особенно --format json, используемый в IntelliJ Rust и других плагинах IDE. Эти проекты уже приспосабливаются к этому изменению, и за статусом вывода JSON можно следить в соответствующей задаче.


Стабилизированные API



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


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


Участники 1.70.0


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


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


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


Данную статью совместными усилиями перевели TelegaOvoshey, kunansy, andreevlex и funkill.

Теги:
Хабы:
Всего голосов 13: ↑13 и ↓0+13
Комментарии24

Публикации

Истории

Работа

Rust разработчик
9 вакансий

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань