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

Комментарии (19)


  1. Siddthartha
    02.06.2023 17:23

    все хорошо, но, как оказалось, сбилдить статически что-либо с зависимостями не так-то просто.


    1. alex-open-plc
      02.06.2023 17:23

      Ещё более "не так то просто" собрать zero-time приложение. То, что используется в микроконтроллерах...
      Не пробовал, но с трудом представляю, как на "ржавом" писать драйвера для линукс...


      1. lain8dono
        02.06.2023 17:23

        zero-time это без core? Для чего и зачем?

        Для ATiny или чего-то такого лучше уж сразу на ассемблере писать. Да и более жирные AVR - скорее игрушки для мазохистов (даже не как что-то плохое). Для адекватных микроконтроллеров без core что-то адекватное писать смысла нет. В некотором смысле core изначально рассчитана на подобное использование.

        Вообще embedded предполагает некоторые дополнительные знания касательно инструментов. Как минимум нужно иметь специальный тулчейн для таргета и понимание процесса сборки бинарника. И в этом смысле rust ничем не отличается от других языков.

        На сколько я знаю, единственный серьезный проблемный момент - нет простого способа писать panic-free код на rust.


        1. Siddthartha
          02.06.2023 17:23
          +1

          а необходимость статического билда несерьезный момент?) заметили, что когда человек спрашивает как сделать что-либо и люди не знают -- они начинают рассказывать что ему это не нужно?) это же как в анекдоте "доктор, когда я делаю так мне больно -- не делайте так"

          я вот хочу статический билд с использованием tch-rs -- пока "нивкакую"


          1. lain8dono
            02.06.2023 17:23

            а необходимость статического билда несерьезный момент?

            я вот хочу статический билд с использованием tch-rs -- пока "нивкакую"

            А это точно проблема Rust? Выглядит как проблема конкретной либы. Возможно стоит прочитать README или типа того. Ну или спросить этих торчков-наркоманов, что они там намудрили.


          1. Gorthauer87
            02.06.2023 17:23

            В каком смысле статический билд? Под контроллер же by design собирается именно статический бинарник.


            1. lain8dono
              02.06.2023 17:23

              На самом деле нет. Просто обычно вы не очень хотите делать свой собственный линковщик с нуля.


          1. tzlom
            02.06.2023 17:23

            это буквально биндинг libtorch, как вы его себе статическим представляете?


            1. Gorthauer87
              02.06.2023 17:23

              Так если собрать саму libtorch статически, то и все будет статикой. Это все не проблема раста, это как раз вопросы к скриптам сборки tch-rs, просто спросите и них.




  1. quaer
    02.06.2023 17:23

    На чём писать и отлаживать на нём можно нормально? Отладчик LLDB в VS Code валится на коде из 4-х строчек.


    1. AnthonyMikh
      02.06.2023 17:23
      +4

      Если вам для написания программ на Rust нужен отладчик, то вы пишете на нём неправильно /s


      1. quaer
        02.06.2023 17:23
        +2

        Перед написанием полезно потренироваться :)


    1. slonopotamus
      02.06.2023 17:23

      Использую Clion, доволен.


      1. quaer
        02.06.2023 17:23

        Он же платный, неохота покупать, пока нет задачи на нём профессионально писать. А в IntellliJ отладчика нет.


        1. slonopotamus
          02.06.2023 17:23

          Jetbrains раздают бесплатные лицензии на свои продукты разработчикам открытого софта. Но вообще - вы спросили в чём нормально работать, я ответил.


    1. JustForFun88
      02.06.2023 17:23

      Это действительно странно. Пару раз использовал отладчик чтобы понять где логическая ошибка и еще ни разу ничего не валилось.


    1. godzie
      02.06.2023 17:23

      А не могли бы вы показать эти строчки?