- PVSM.RU - https://www.pvsm.ru -
Команда разработчиков Rust рада сообщить о выпуске новой версии Rust, 1.33.0. Rust — это язык программирования, который дает возможность каждому создавать надежное и эффективное программное обеспечение.
Если у вас установлена предыдущая версия Rust с помощью rustup
, то для обновления Rust до версии 1.33.0 вам достаточно выполнить:
$ rustup update stable
Если у вас еще не установлен rustup
, вы можете установить его [1] с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.33.0 [2] можно ознакомиться на GitHub.
Основные улучшения этого выпуска: значительное расширение возможностей const fn
и стабилизация нового Pin API.
const fn
const fn
теперь умеет гораздо больше [3], а именно:
const fn foo((x, y): (u8, u8)) { ... }
)let
привязки (например, let x = 1;
)let
привязки (например, let mut x = 1;
)x = y
) и операторов присваивания (например, x += y
), включая присваивание проекциям (например, полю структуры или результату оператора индексирования — x[3] = 42
)3;
)Еще теперь можно вызывать "const unsafe fn" из "const fn" [4], например:
const unsafe fn foo() -> i32 { 5 }
const fn bar() -> i32 {
unsafe { foo() }
}
Благодаря этим улучшениям стало возможным объявить константными большое количество функций стандартной библиотеки. Они перечислены ниже в библиотечной секции.
Данный выпуск привносит в язык новый механизм, представленный типом 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].
Подробности смотрите в примечаниях к выпуску [2].
Как было объявлено ранее [26], начиная с этого выпуска crates.io будет требовать подтверждения почтового адреса для публикации крейтов. Начиная с 2019-03-01 00:00 UTC выполнение cargo publish
будет завершаться с ошибкой для учетных записей без подтвержденной почты.
Это необходимо для соответствия требованиям DMCA [27]. Если вы не заметили предупреждений об этом, которые cargo писал в последних выпусках, зайдите в crates.io/me [28] для указания и подтверждения вашей почты. Данный почтовый адрес никогда не будет опубликован и будет использован исключительно для непосредственного функционала crates.io.
Множество людей совместно создавало 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
[11] Метод get всех NonZero типов теперь константен.: https://github.com/rust-lang/rust/pull/57167
[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
[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
[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