Выпуск Rust 1.33.0

оригинал: The Rust Release Team • перевод: ozkriff • новости • поддержите на Patreon

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

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

1
$ rustup update stable

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

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

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

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

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

Ещё теперь можно вызывать «const unsafe fn» из «const fn», например:

1
2
3
4
const unsafe fn foo() -> i32 { 5 }
const fn bar() -> i32 {
    unsafe { foo() }
}

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

Pin API

Данный выпуск привносит в язык новый механизм, представленный типом std::pin::Pin<P> и маркерным типажом Unpin. Основная идея подробно описана в документации «std: pin» модуля:

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

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

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

Импортировать как _

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

1
2
3
4
use std::io::Read as _;

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

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

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

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

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

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

Улучшения в Cargo

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

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

Crates.io

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

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

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

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


Обсуждение на форуме.