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


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


rustup update stable

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


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


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


Настройка проверок при помощи Cargo


Как было предложено в RFC 3389, файл Cargo.toml теперь поддерживает таблицу [lints] для настройки уровня сообщений (forbid, deny, warn, allow) для проверок от компилятора и других инструментов. Таким образом, вместо установки RUSTFLAGS в -F/-D/-W/-A (что повлияло бы на всю сборку) или использования атрибутов уровня крейта:


#![forbid(unsafe_code)]
#![deny(clippy::enum_glob_use)]

Вы можете просто указать уровни сообщений в манифесте пакета, и они будут обработаны Cargo:


[lints.rust]
unsafe_code = "forbid"

[lints.clippy]
enum_glob_use = "deny"

Также их можно настроить в таблице [workspace.lints], и затем они будут унаследованы [lints] workspace = true, как и многие другие параметры рабочей области. Cargo также будет отслеживать изменения в этих настройках при принятии решения о том, какие крейты необходимо пересобрать.


Для получения дополнительной информации смотрите разделы lints и workspace.lints справочного руководства по Cargo.


Авторизация в Cargo Registry


В этот выпуск включены ещё две связанные с Cargo функции: провайдеры учётных данных и аутентификация для приватных реестров.


Провайдеры авторизации позволяют настраивать способ, которым Cargo получает учётные данные для реестра. Встроенные провайдеры включены для безопасных секретных хранилищ, специфичных для конкретной операционной системы, в Linux, macOS и Windows. Кроме того, для поддержки произвольных методов хранения или генерации токенов могут быть созданы сторонние провайдеры. Использование защищённых провайдеров учётных данных снижает риск утечки токенов реестра.


Дополнительно реестры теперь могут требовать аутентификацию для всех операций, а не только для публикации. Это позволяет приватным реестрам предлагать более безопасное размещение крейтов. Использование приватных реестров требует настройки провайдера авторизации.


Более подробную информацию смотрите в документации Cargo.


Проекции в непрозрачных возвращаемых типах


Если вы когда-либо получали сообщение об ошибке вроде "return type cannot contain a projection or Self that references lifetimes from a parent scope", то можете теперь быть спокойны! Компилятор позволяет упоминать Self и связанные с ним типы в непрозрачных возвращаемых типах, таких как async fn и -> impl Trait. Благодаря улучшениям вроде этого Rust лучше соответствует вашим интуитивным ожиданиям от него, даже если вы понятия не имеете о таких элементах технического жаргона, как "проекция".


Эта функциональность имела статус нестабильной, потому что изначально её реализация неправильно обрабатывала захваченные времена жизни. Как только это было исправлено, разработчики сделали паузу и убедились, что она не содержит ошибок, ведущих к неопределённому поведению. Для получения более подробной технической информации смотрите запрос на стабилизацию, в котором описаны все примеры, которые теперь разрешены:


struct Wrapper<'a, T>(&'a T);

// Непрозрачные возвращаемые типы, в которых упоминается "Self`:
impl Wrapper<'_, ()> {
    async fn async_fn() -> Self { /* ... */ }
    fn impl_trait() -> impl Iterator<Item = Self> { /* ... */ }
}

trait Trait<'a> {
    type Assoc;
    fn new() -> Self::Assoc;
}
impl Trait<'_> for () {
    type Assoc = ();
    fn new() {}
}

// Непрозрачный возвращаемый тип, в котором упоминается связанный тип:
impl<'a, T: Trait<'a>> Wrapper<'a, T> {
    async fn mk_assoc() -> T::Assoc { /* ... */ }
    fn a_few_assocs() -> impl Iterator<Item = T::Assoc> { /* ... */ }
}

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



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



Замечания о совместимости


  • Как было сообщено ранее, Rust 1.74 повышает требования к платформам Apple. Теперь минимальные версии такие:
    • macOS: 10.12 Sierra (первый выпуск 2016)
    • iOS: 10 (первый выпуск 2016)
    • tvOS: 10 (первый выпуск 2016)

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


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


Участники 1.74.0


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


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


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


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

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


  1. kovserg
    20.11.2023 12:30

    Rust повышает требования к платформам

    Зачем это делать?


    1. iliazeus
      20.11.2023 12:30
      +3

      По ссылке в этом же абзаце описаны причины (раздел "Why are the requirements being changed?").


    1. domix32
      20.11.2023 12:30
      +2

      tldr - непонятно как это тестировать на железках, в первую очередь мобильных - тулчейны эплом больше не поддерживаются, установка софта на те устройства происходит через такую-то матерь, выхлоп от поддержки такого железа тоже сомнительный. Пока политика эппл касательно поддержки легаси не изменится ситуация продолжит происходить время от времени.


      1. kovserg
        20.11.2023 12:30

        Так в отношении винды такая же политика.