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


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


$ rustup update stable

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


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


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


Встроенные const выражения


Блоки const { ... } теперь стабильны в позиции выражения, что позволяет явно вводить константный контекст без необходимости дополнительных объявлений (например, определения const элементов или асоциированных констант для типажа).


В отличие от обычных констант (const ITEM: ... = ...), встроенные константы могут использоваться в обобщениях — их тип будет подразумеваться, его будет не нужно прописывать явно, что сделает их использование удобным во встроенных фрагментах кода. Например в подобном случае:


const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];

теперь можно записать так:


let foo = [const { None }; 100];

Примечательно, что это также верно для общих контекстов, где ранее требовалось подробное объявление типажей с ассоциированной константой:


fn create_none_array<T, const N: usize>() -> [Option<T>; N] {
    [const { None::<T> }; N]
}

Это делает код более кратким и лёгким для чтения.


Подробности смотрите в справочной документации.


Ограничения в позиции ассоциированного типа


Rust 1.79 стабилизирует синтаксис ограничений ассоциированных элементов, который позволяет нам размещать ограничения в позиции ассоциированного типа внутри других ограничений, т.е. T: Trait<Assoc: Bounds...>. Это позволяет избежать необходимости указывать дополнительный явный обобщённый тип только для ограничения ассоциированного типа.


Эта функция позволяет указать ограничения в нескольких местах, которые ранее были либо невозможны, либо налагали дополнительные ненужные ограничения на использование:


  • В where — эквивалентно разделению ограничений на два (или более) where. Например, where T: Trait<Assoc: Bound> эквивалентно where T: Trait, <T as Trait>::Assoc: Bound
  • Супертипажи — ограничения, указанные с помощью нового синтаксиса, применяются при использовании типажа, а не при объявлении ограничения. Например trait CopyIterator: Iterator<Item: Copy> {}
  • Границы элементов ассоциированных типов — это позволяет ограничить вложенные жёсткие проекции, которые ассоциированы с ассоциированным типом типажа. Например trait Trait { type Assoc: Trait2<Assoc2: Copy>; }
  • Непрозрачные границы типов (RPIT, TAIT) — они позволяют ограничить ассоциированные типы, которые ассоциированы с непрозрачным типом, не имеющим имени. Например, impl Iterator<Item: Copy> объявляет итератор, элементы которого реализуют типаж Copy без указания в ограничениях настоящего имени типа

Более подробную информацию можно найти в отчёте о стабилизации.


Продление автоматического времени жизни


Временные объекты, на которые можно непосредственно ссылаться в конструкциях, теперь автоматически продлевают время жизни в конструкциях match и if. Это происходит так же, как и продление времени жизни временных объектов в блочных конструкциях.


Например:


let a = if true {
    ..;
    &temp() // раньше это вызвало ошибку, но теперь время жизни продлено
} else {
    ..;
    &temp() // раньше это вызвало ошибку, но теперь время жизни продлено
};

и


let a = match () {
    _ => {
        ..;
        &temp() // раньше это вызвало ошибку, но теперь время жизни продлено
    }
};

теперь соответствуют предыдущему поведению:


let a = {
    ..;
    &temp() // время жизни продлено
};

Такое поведение обратно совместимо, поскольку эти программы раньше не компилировались.


Указатели фреймов включены в сборках стандартной библиотеки


Стандартная библиотека, поставляемая Rust, теперь компилируется с -Cforce-frame-pointers=yes, что позволяет её пользователями легче профилировать свои программы. Обратите внимание, что стандартная библиотека также поставляется и с отладочной информацией (например, DWARF), которая по умолчанию удаляется в релизных профилях Cargo.


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



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



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


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


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


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


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


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


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

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