Команда 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
{integer}::unchecked_add
{integer}::unchecked_mul
{integer}::unchecked_sub
<[T]>::split_at_unchecked
<[T]>::split_at_mut_unchecked
<[u8]>::utf8_chunks
str::Utf8Chunks
str::Utf8Chunk
<*const T>::is_aligned
<*mut T>::is_aligned
NonNull::is_aligned
<*const [T]>::len
<*mut [T]>::len
<*const [T]>::is_empty
<*mut [T]>::is_empty
NonNull::<[T]>::is_empty
CStr::count_bytes
io::Error::downcast
num::NonZero<T>
path::absolute
proc_macro::Literal::byte_character
proc_macro::Literal::c_string
Следующие API теперь можно использовать в контексте const
:
Atomic*::into_inner
io::Cursor::new
io::Cursor::get_ref
io::Cursor::position
io::empty
io::repeat
io::sink
panic::Location::caller
panic::Location::file
panic::Location::line
panic::Location::column
Прочие изменения
Проверьте всё, что изменилось в Rust, Cargo и Clippy.
Кто работал над 1.79.0
Многие люди собрались вместе, чтобы создать Rust 1.79.0. Без вас мы бы не справились. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Данную статью совместными усилиями перевели andreevlex, TelegaOvoshey и funkill.