Перейти к содержанию

Анонс Rust 1.70.0

Posted on:5 июня 2023 г. at 10:02

Example Dynamic OG Image link 01 июня 2023 · Команда по выпуску Rust

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

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

rustup update stable

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

Если вы хотите помочь нам, протестировав будущие версии, вы можете рассмотреть возможность локального обновления, чтобы использовать бета-канал (rustup default beta) или ночной канал (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, размещенного в GitHub, для изменения значения по умолчанию можно использовать параметр конфигурации registries.crates-io.protocol.

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

OnureCell и OnureLock

Два новых типа были стабилизированы для одноразовой инициализации общих данных: 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} wins!");
}

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

IsTerminal

Этот недавно стабилизированный трейт имеет единственный метод, is_terminal, чтобы определить, представляет ли данный дескриптор или дескриптор файла терминал или TTY. Это еще один случай стандартизации функциональности, которая существовала во внешних пакетах, таких как atty и is-terminal, с использованием функции isatty библиотеки C в целях 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 имеет ряд опций, в том числе некоторые, которые еще не стабилизированы и требуют указания -Zunstable-options, как и многие другие команды в цепочке инструментов Rust. Однако, хотя это предназначено только для ночных сборок, это ограничение не было активным в тестировании - до сих пор. Начиная с версии 1.70.0, стабильные и бета-сборки Rust больше не будут допускать нестабильные варианты тестирования, что делает их действительно только для ночных, как задокументировано.

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

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

Другие изменения

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

Участники 1.70.0

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