- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада сообщить о новой версии языка — 1.64.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.64.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё нет rustup
, то можете установить его со страницы [1] на нашем веб-сайте, а также ознакомиться с подробным описанием выпуска 1.64.0 [2] на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta
) или nightly (rustup default nightly
) канал. Пожалуйста, сообщайте [3] обо всех встреченных вами ошибках.
.await
с помощью IntoFuture
В Rust 1.64 стабилизирован трейт IntoFuture
[4]. Он похож на трейт IntoIterator
[5], но вместо поддержки циклов for ... in ...
, IntoFuture
изменяет поведение .await
. С IntoFuture
ключевое слово .await
может применяться не только на футурах, но и на всём, что может быть преобразовано в Future
при помощи IntoFuture
, что сделает ваше API более простым для использования!
Возьмём, к примеру, билдер, который создаёт запрос к некоторому сетевому хранилищу:
pub struct Error { ... }
pub struct StorageResponse { ... }:
pub struct StorageRequest(bool);
impl StorageRequest {
/// Создать новый экземпляр `StorageRequest`.
pub fn new() -> Self { ... }
/// Решить, будет ли включён отладочный режим.
pub fn set_debug(self, b: bool) -> Self { ... }
/// Отправить запрос и получить ответ.
pub async fn send(self) -> Result<StorageResponse, Error> { ... }
}
Типичное использование, вероятно, будет выглядеть так:
let response = StorageRequest::new() // 1. Создать экземпляр
.set_debug(true) // 2. Установить некоторые настройки
.send() // 3. Сконструировать Future
.await?; // 4. Запустить Future + пробросить ошибки
Это уже неплохо, но мы можем сделать лучше. Используя IntoFuture
, мы можем сделать за один шаг "создание футуры" (строка 3) и "запуск футуры" (строка 4):
let response = StorageRequest::new() // 1. Создать экземпляр
.set_debug(true) // 2. Установить некоторые настройки
.await?; // 3. Сконструировать + запустить Future + пробросить ошибки
Мы можем сделать это, реализовав IntoFuture
для StorageRequest
. IntoFuture
требует от нас наличия именованной футуры, которую мы возвращаем. Её мы можем создать упакованной и объявить для неё псевдоним:
// Сначала мы должны импортировать в область видимости несколько новых типов.
use std::pin::Pin;
use std::future::{Future, IntoFuture};
pub struct Error { ... }
pub struct StorageResponse { ... }
pub struct StorageRequest(bool);
impl StorageRequest {
/// Создадим новый экземпляр `StorageRequest`.
pub fn new() -> Self { ... }
/// Решим, следует ли включить режим отладки.
pub fn set_debug(self, b: bool) -> Self { ... }
/// Отправим запрос и получим ответ
pub async fn send(self) -> Result<StorageResponse, Error> { ... }
}
// Новая имплементация
// 1. Создадим новый именованный тип футуры
// 2. Имплементируем `IntoFuture` для `StorageRequest`
pub type StorageRequestFuture = Pin<Box<dyn Future<Output = Result<StorageResponse, Error> + Send + 'static>>
impl IntoFuture for StorageRequest {
type IntoFuture = StorageRequestFuture;
type Output = <StorageRequestFuture as Future>::Output;
fn into_future(self) -> Self::IntoFuture {
Box::pin(self.send())
}
}
Это требует немного больше кода для реализации, но предоставляет более простой API для пользователей.
Мы надеемся, что в будущем Rust Async WG упростит создание новой именованной футуры при помощи impl Trait
в type
("Type Alias Impl Trait" или TAIT) [6]. Это должно облегчить реализацию IntoFuture
за счёт упрощения сигнатуры псевдонима и улучшить производительность за счёт удаления из псевдонима упаковки (Box
).
Вызывая или будучи вызванным C ABI, код Rust может использовать псевдонимы типов, такие как c_uint
или c_ulong
для сопоставления соответствующих типов из C на любой целевой сборке, не требуя специализированного кода или условий.
Раньше эти псевдонимы типов были доступны только в std
, поэтому код, написанный для встроенных систем и других сценариев, которые могли использовать только core
или alloc
, не мог использовать эти типы.
Rust 1.64 теперь предоставляет все псевдонимы типа c_*
в core::ffi
[7], а также core::ffi::CStr
[8] для работы со строками C. Rust 1.64 также предоставляет alloc::ffi::CString
[9] для работы с собственными строками C, используя только крейт alloc
, а не полную библиотеку std
.
Rust-analyzer [10] теперь входит в набор инструментов, включённых в Rust. Это упрощает загрузку и доступ к rust-analyzer, а также делает его доступным на большем количестве платформ. Он доступен как компонент rustup [11], который можно установить с помощью:
rustup component add rust-analyzer
В настоящее время, чтобы запустить версию, установленную rustup, вам нужно вызвать её следующим образом:
rustup run stable rust-analyzer
В следующем выпуске rustup предоставит встроенный прокси-сервер, так что при запуске исполняемого файла rust-analyzer
будет запускаться соответствующая версия.
Большинству пользователей следует продолжать использовать выпуски, предоставленные командой rust-analyzer, которые публикуются чаще. Они доступны на странице выпусков rust-analyzer [12]. Это не затрагивает пользователей официального расширения VSCode [13], поскольку оно автоматически загружает и обновляет выпуски в фоновом режиме.
Теперь при работе с коллекциями связанных библиотек или бинарных крейтов в одном рабочем пространстве Cargo, вы можете избежать дублирования общих значений полей между крейтами, таких как общие номера версий, URL-адреса репозитория или rust-version
. Это также помогает синхронизировать эти значения между крейтами при их обновлении. Дополнительные сведения см. в workspace.package
[14], workspace.dependencies
[15] и "наследование зависимости от рабочего пространства" [16].
При сборке для нескольких целей вы сможете передать несколько опций --target
в cargo build
, чтобы собрать их все одновременно. Вы также можете установить для build.target
[17] массив из нескольких целей в .cargo/config.toml
, чтобы по умолчанию выполнять сборку для нескольких целей.
Стабилизированы следующие методы и реализации трейтов:
future::IntoFuture
[18]num::NonZero*::checked_mul
[19]num::NonZero*::checked_pow
[20]num::NonZero*::saturating_mul
[21]num::NonZero*::saturating_pow
[22]num::NonZeroI*::abs
[23]num::NonZeroI*::checked_abs
[24]num::NonZeroI*::overflowing_abs
[25]num::NonZeroI*::saturating_abs
[26]num::NonZeroI*::unsigned_abs
[27]num::NonZeroI*::wrapping_abs
[28]num::NonZeroU*::checked_add
[29]num::NonZeroU*::checked_next_power_of_two
[30]num::NonZeroU*::saturating_add
[31]os::unix::process::CommandExt::process_group
[32]os::windows::fs::FileTypeExt::is_symlink_dir
[33]os::windows::fs::FileTypeExt::is_symlink_file
[34]Типы, ранее стабилизированные в std::ffi
и теперь доступные в core
и alloc
:
core::ffi::CStr
[35]core::ffi::FromBytesWithNulError
[36]alloc::ffi::CString
[37]alloc::ffi::FromVecWithNulError
[38]alloc::ffi::IntoStringError
[39]alloc::ffi::NulError
[40]Типы, ранее стабилизированные в std::os::raw
и теперь доступные в core::ffi
и std::ffi
:
ffi::c_char
[41]ffi::c_double
[42]ffi::c_float
[43]ffi::c_int
[44]ffi::c_long
[45]ffi::c_longlong
[46]ffi::c_schar
[47]ffi::c_short
[48]ffi::c_uchar
[49]ffi::c_uint
[50]ffi::c_ulong
[51]ffi::c_ulonglong
[52]ffi::c_ushort
[53]Были стабилизированы несколько вспомогательных функций, которые используются с Poll
, низкоуровневой реализацией футур:
future::poll_fn
[54]task::ready!
[55]Мы надеемся, что в будущем сможем предоставить более простое API, которое будет требовать меньше использования низкоуровневых деталей, таких как Poll
и Pin
. Но сейчас данные вспомогательные функции упростят написание такого кода.
Следующие API теперь возможно использовать в контексте const
:
linux
потребуется ядро Linux 3.2 и выше (за исключением тех целей, которые уже требуют более новое ядро). Также цели linux-gnu
теперь требуют glibc 2.17 (за исключением тех, которые уже требуют более новую glibc).Ipv4Addr
, Ipv6Addr
, SocketAddrV4
и SocketAddrV6
, чтобы сделать её более компактной и эффективной. Это внутреннее представление никогда не раскрывалось, но некоторые крейты всё равно полагались на него, используя std::mem::transmute
, что приводило к недопустимым обращениям к памяти. Такие детали внутренней реализации стандартной библиотеки никогда не считаются стабильным интерфейсом. Чтобы ограничить ущерб, мы работали с авторами всех ещё поддерживаемых крейтов, чтобы выпустить исправленные версии, которые отсутствовали более года. Подавляющее большинство затронутых пользователей будут иметь возможность смягчить последствия с помощью cargo update
.Выпуск Rust 1.64 включает и другие изменения:
unused_tuple_struct_fields
, чтобы получить аналогичное предупреждение о неиспользуемых полях в кортежных структурах. В будущих версиях мы планируем включить эту проверку по умолчанию. Для полей единичного типа (()
) такое предупреждение не будет генерироваться для облегчения миграции существующего кода без изменения индексов кортежа.Проверьте всё, что изменилось в Rust [2], Cargo [59] и Clippy [60].
Многие люди собрались вместе, чтобы создать Rust 1.64.0. Без вас мы бы не справились. Спасибо! [61]
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате [62] или же в аналогичном чате для новичковых вопросов [63]. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков [64].
Данную статью совместными усилиями перевели andreevlex [65] TelegaOvoshey [66] и funkill [67].
Автор:
RustLangRu
Источник [68]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/379158
Ссылки в тексте:
[1] страницы: https://www.rust-lang.org/install.html
[2] подробным описанием выпуска 1.64.0: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1640-2022-09-22
[3] сообщайте: https://github.com/rust-lang/rust/issues/new/choose
[4] IntoFuture
: https://doc.rust-lang.org/std/future/trait.IntoFuture.html
[5] IntoIterator
: https://doc.rust-lang.org/std/iter/trait.IntoIterator.html
[6] impl Trait
в type
("Type Alias Impl Trait" или TAIT): https://rust-lang.github.io/impl-trait-initiative/explainer/tait.html
[7] core::ffi
: https://doc.rust-lang.org/core/ffi/index.html
[8] core::ffi::CStr
: https://doc.rust-lang.org/core/ffi/struct.CStr.html
[9] alloc::ffi::CString
: https://doc.rust-lang.org/alloc/ffi/struct.CString.html
[10] Rust-analyzer: https://rust-analyzer.github.io/
[11] компонент rustup: https://rust-lang.github.io/rustup/concepts/components.html
[12] странице выпусков rust-analyzer: https://github.com/rust-lang/rust-analyzer/releases
[13] официального расширения VSCode: https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer
[14] workspace.package
: https://doc.rust-lang.org/cargo/reference/workspaces.html#the-package-table
[15] workspace.dependencies
: https://doc.rust-lang.org/cargo/reference/workspaces.html#the-dependencies-table
[16] "наследование зависимости от рабочего пространства": https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#inheriting-a-dependency-from-a-workspace
[17] build.target
: https://doc.rust-lang.org/cargo/reference/config.html#buildtarget
[18] future::IntoFuture
: https://doc.rust-lang.org/stable/std/future/trait.IntoFuture.html
[19] num::NonZero*::checked_mul
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_mul
[20] num::NonZero*::checked_pow
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_pow
[21] num::NonZero*::saturating_mul
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_mul
[22] num::NonZero*::saturating_pow
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_pow
[23] num::NonZeroI*::abs
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.abs
[24] num::NonZeroI*::checked_abs
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.checked_abs
[25] num::NonZeroI*::overflowing_abs
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.overflowing_abs
[26] num::NonZeroI*::saturating_abs
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.saturating_abs
[27] num::NonZeroI*::unsigned_abs
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.unsigned_abs
[28] num::NonZeroI*::wrapping_abs
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroIsize.html#method.wrapping_abs
[29] num::NonZeroU*::checked_add
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_add
[30] num::NonZeroU*::checked_next_power_of_two
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.checked_next_power_of_two
[31] num::NonZeroU*::saturating_add
: https://doc.rust-lang.org/stable/std/num/struct.NonZeroUsize.html#method.saturating_add
[32] os::unix::process::CommandExt::process_group
: https://doc.rust-lang.org/stable/std/os/unix/process/trait.CommandExt.html#tymethod.process_group
[33] os::windows::fs::FileTypeExt::is_symlink_dir
: https://doc.rust-lang.org/stable/std/os/windows/fs/trait.FileTypeExt.html#tymethod.is_symlink_dir
[34] os::windows::fs::FileTypeExt::is_symlink_file
: https://doc.rust-lang.org/stable/std/os/windows/fs/trait.FileTypeExt.html#tymethod.is_symlink_file
[35] core::ffi::CStr
: https://doc.rust-lang.org/stable/core/ffi/struct.CStr.html
[36] core::ffi::FromBytesWithNulError
: https://doc.rust-lang.org/stable/core/ffi/struct.FromBytesWithNulError.html
[37] alloc::ffi::CString
: https://doc.rust-lang.org/stable/alloc/ffi/struct.CString.html
[38] alloc::ffi::FromVecWithNulError
: https://doc.rust-lang.org/stable/alloc/ffi/struct.FromVecWithNulError.html
[39] alloc::ffi::IntoStringError
: https://doc.rust-lang.org/stable/alloc/ffi/struct.IntoStringError.html
[40] alloc::ffi::NulError
: https://doc.rust-lang.org/stable/alloc/ffi/struct.NulError.html
[41] ffi::c_char
: https://doc.rust-lang.org/stable/std/ffi/type.c_char.html
[42] ffi::c_double
: https://doc.rust-lang.org/stable/std/ffi/type.c_double.html
[43] ffi::c_float
: https://doc.rust-lang.org/stable/std/ffi/type.c_float.html
[44] ffi::c_int
: https://doc.rust-lang.org/stable/std/ffi/type.c_int.html
[45] ffi::c_long
: https://doc.rust-lang.org/stable/std/ffi/type.c_long.html
[46] ffi::c_longlong
: https://doc.rust-lang.org/stable/std/ffi/type.c_longlong.html
[47] ffi::c_schar
: https://doc.rust-lang.org/stable/std/ffi/type.c_schar.html
[48] ffi::c_short
: https://doc.rust-lang.org/stable/std/ffi/type.c_short.html
[49] ffi::c_uchar
: https://doc.rust-lang.org/stable/std/ffi/type.c_uchar.html
[50] ffi::c_uint
: https://doc.rust-lang.org/stable/std/ffi/type.c_uint.html
[51] ffi::c_ulong
: https://doc.rust-lang.org/stable/std/ffi/type.c_ulong.html
[52] ffi::c_ulonglong
: https://doc.rust-lang.org/stable/std/ffi/type.c_ulonglong.html
[53] ffi::c_ushort
: https://doc.rust-lang.org/stable/std/ffi/type.c_ushort.html
[54] future::poll_fn
: https://doc.rust-lang.org/stable/std/future/fn.poll_fn.html
[55] task::ready!
: https://doc.rust-lang.org/stable/std/task/macro.ready.html
[56] slice::from_raw_parts
: https://doc.rust-lang.org/stable/core/slice/fn.from_raw_parts.html
[57] ранее анонсировано: https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html
[58] прекращения поддержки RLS: https://blog.rust-lang.org/2022/07/01/RLS-deprecation.html
[59] Cargo: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-164-2022-09-22
[60] Clippy: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-164
[61] Спасибо!: https://thanks.rust-lang.org/rust/1.64.0/
[62] русскоязычном Телеграм-чате: https://t.me/rustlang_ru
[63] чате для новичковых вопросов: https://t.me/rust_beginners_ru
[64] чат переводчиков: https://t.me/rustlang_ru_translations
[65] andreevlex: https://habr.com/ru/users/andreevlex/
[66] TelegaOvoshey: https://habr.com/ru/users/telegaovoshey/
[67] funkill: https://habr.com/ru/users/funkill/
[68] Источник: https://habr.com/ru/post/689876/?utm_source=habrahabr&utm_medium=rss&utm_campaign=689876
Нажмите здесь для печати.