- PVSM.RU - https://www.pvsm.ru -

Выпуск Rust 1.33

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

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

$ rustup update stable

Если у вас еще не установлен rustup, вы можете установить его [1] с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.33.0 [2] можно ознакомиться на GitHub.

Что вошло в стабильную версию 1.33.0

Основные улучшения этого выпуска: значительное расширение возможностей const fn и стабилизация нового Pin API.

Расширение возможностей const fn

const fn теперь умеет гораздо больше [3], а именно:

  • безусловное (irrefutable) сопоставление с образцом (например, const fn foo((x, y): (u8, u8)) { ... })
  • let привязки (например, let x = 1;)
  • изменяемые let привязки (например, let mut x = 1;)
  • выражения присваивания (например x = y) и операторов присваивания (например, x += y), включая присваивание проекциям (например, полю структуры или результату оператора индексирования — x[3] = 42)
  • инструкции выражений (expression statements) (например, 3;)

Еще теперь можно вызывать "const unsafe fn" из "const fn" [4], например:

const unsafe fn foo() -> i32 { 5 }
const fn bar() -> i32 {
    unsafe { foo() }
}

Благодаря этим улучшениям стало возможным объявить константными большое количество функций стандартной библиотеки. Они перечислены ниже в библиотечной секции.

Pin API

Данный выпуск привносит в язык новый механизм, представленный типом std::pin::Pin и маркерным типажом Unpin [5]. Основная идея подробно описана в документации "std::pin" модуля [6]:

Иногда может быть полезно запретить перемещение объекта, т.е. гарантировать неизменность его адреса в памяти. Основным сценарием использования такой возможности являются самоссылающиеся структуры, поскольку перемещение таких объектов приведет к инвалидации указателей, что может привести к неопределенному поведению (UB).

Pin<P> гарантирует, что объект, на который ссылается любой указатель типа P, имеет неизменное расположение в памяти, т.е. он не может быть перемещен и его память не может быть освобождена. Такие значения называются "закрепленными" ("pinned").

Ожидается, что этот механизм будет использоваться в основном авторами библиотек, поэтому мы сейчас не станем погружаться глубже в детали (с которыми можно ознакомиться в документации по ссылке выше). Однако, стабилизация этого API является важным событием для всех пользователей Rust, потому что является ключевым этапом на пути к очень ожидаемому async/await. За статусом оставшейся работы в этом направлении можно следить на areweasyncyet.rs [7].

Импортирование как "_"

Теперь можно импортировать сущности как "_" [8]. Это позволяет импортировать реализации типажа без занесения его имени в текущее пространство имен, например:

use std::io::Read as _;

// Тут не возникнет конфликта имен:
pub trait Read {}

Подробности смотрите в примечаниях к выпуску [2].

Стабилизация стандартной библиотеки

Вот список всего, что стало константным:

Кроме того, стабилизированы следующие API:

Подробности смотрите в примечаниях к выпуску [2].

Улучшения в Cargo

Теперь cargo пересобирает крейт, если какой-то из его файлов был изменен во время изначальной сборки. [25]

Подробности смотрите в примечаниях к выпуску [2].

Crates.io

Как было объявлено ранее [26], начиная с этого выпуска crates.io будет требовать подтверждения почтового адреса для публикации крейтов. Начиная с 2019-03-01 00:00 UTC выполнение cargo publish будет завершаться с ошибкой для учетных записей без подтвержденной почты.

Это необходимо для соответствия требованиям DMCA [27]. Если вы не заметили предупреждений об этом, которые cargo писал в последних выпусках, зайдите в crates.io/me [28] для указания и подтверждения вашей почты. Данный почтовый адрес никогда не будет опубликован и будет использован исключительно для непосредственного функционала crates.io.

Разработчики 1.33.0

Множество людей совместно создавало Rust 1.33. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо! [29]

Автор: ozkriff

Источник [30]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/310265

Ссылки в тексте:

[1] установить его: https://www.rust-lang.org/install.html

[2] подробными примечаниями к выпуску Rust 1.33.0: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1330-2019-02-28

[3] теперь умеет гораздо больше: https://github.com/rust-lang/rust/pull/57175

[4] теперь можно вызывать "const unsafe fn" из "const fn": https://github.com/rust-lang/rust/pull/57067

[5] типом std::pin::Pin и маркерным типажом Unpin: https://doc.rust-lang.org/std/pin/struct.Pin.html

[6] в документации "std::pin" модуля: https://doc.rust-lang.org/std/pin/index.html

[7] areweasyncyet.rs: https://areweasyncyet.rs/

[8] Теперь можно импортировать сущности как "_": https://github.com/rust-lang/rust/pull/56303

[9] Методы overflowing_{add, sub, mul, shl, shr} всех численных типов теперь константны.: https://github.com/rust-lang/rust/pull/57566

[10] Методы rotate_left, rotate_right, и wrapping_{add, sub, mul, shl, shr} всех численных типов теперь константны.: https://github.com/rust-lang/rust/pull/57105

[11] Метод get всех NonZero типов теперь константен.: https://github.com/rust-lang/rust/pull/57167

[12] Методы count_ones, count_zeros, leading_zeros, trailing_zeros, swap_bytes, from_be, from_le, to_be, to_le всех числовых типов теперь константны.: https://github.com/rust-lang/rust/pull/57234

[13] unix::FileExt::read_exact_at: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.read_exact_at

[14] unix::FileExt::write_all_at: https://doc.rust-lang.org/std/os/unix/fs/trait.FileExt.html#method.write_all_at

[15] Option::transpose: https://doc.rust-lang.org/std/option/enum.Option.html#method.transpose

[16] Result::transpose: https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose

[17] convert::identity: https://doc.rust-lang.org/std/convert/fn.identity.html

[18] marker::Unpin: https://doc.rust-lang.org/stable/std/marker/trait.Unpin.html

[19] marker::PhantomPinned: https://doc.rust-lang.org/nightly/std/marker/struct.PhantomPinned.html

[20] Vec::resize_with: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.resize_with

[21] VecDeque::resize_with: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.resize_with

[22] Duration::as_millis: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_millis

[23] Duration::as_micros: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_micros

[24] Duration::as_nanos: https://doc.rust-lang.org/std/time/struct.Duration.html#method.as_nanos

[25] Теперь cargo пересобирает крейт, если какой-то из его файлов был изменен во время изначальной сборки.: https://github.com/rust-lang/cargo/pull/6484

[26] Как было объявлено ранее: https://users.rust-lang.org/t/a-verified-email-address-will-be-required-to-publish-to-crates-io-starting-on-2019-02-28/22425

[27] DMCA: https://ru.wikipedia.org/wiki/Digital_Millennium_Copyright_Act

[28] crates.io/me: https://crates.io/me

[29] Спасибо!: https://thanks.rust-lang.org/rust/1.33.0

[30] Источник: https://habr.com/ru/post/442244/?utm_campaign=442244