Команда разработчиков Rust рада сообщить о выпуске новой версии Rust, 1.33.0. Rust — это язык программирования, который дает возможность каждому создавать надежное и эффективное программное обеспечение.
Если у вас установлена предыдущая версия Rust с помощью rustup
, то для обновления Rust до версии 1.33.0 вам достаточно выполнить:
$ rustup update stable
Если у вас еще не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.33.0 можно ознакомиться на GitHub.
Что вошло в стабильную версию 1.33.0
Основные улучшения этого выпуска: значительное расширение возможностей const fn
и стабилизация нового Pin API.
Расширение возможностей const fn
const fn
теперь умеет гораздо больше, а именно:
- безусловное (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", например:
const unsafe fn foo() -> i32 { 5 }
const fn bar() -> i32 {
unsafe { foo() }
}
Благодаря этим улучшениям стало возможным объявить константными большое количество функций стандартной библиотеки. Они перечислены ниже в библиотечной секции.
Pin API
Данный выпуск привносит в язык новый механизм, представленный типом std::pin::Pin и маркерным типажом Unpin. Основная идея подробно описана в документации "std::pin" модуля:
Иногда может быть полезно запретить перемещение объекта, т.е. гарантировать неизменность его адреса в памяти. Основным сценарием использования такой возможности являются самоссылающиеся структуры, поскольку перемещение таких объектов приведет к инвалидации указателей, что может привести к неопределенному поведению (UB).
Pin<P>
гарантирует, что объект, на который ссылается любой указатель типаP
, имеет неизменное расположение в памяти, т.е. он не может быть перемещен и его память не может быть освобождена. Такие значения называются "закрепленными" ("pinned").
Ожидается, что этот механизм будет использоваться в основном авторами библиотек, поэтому мы сейчас не станем погружаться глубже в детали (с которыми можно ознакомиться в документации по ссылке выше). Однако, стабилизация этого API является важным событием для всех пользователей Rust, потому что является ключевым этапом на пути к очень ожидаемому async
/await
. За статусом оставшейся работы в этом направлении можно следить на areweasyncyet.rs.
Импортирование как "_"
Теперь можно импортировать сущности как "_". Это позволяет импортировать реализации типажа без занесения его имени в текущее пространство имен, например:
use std::io::Read as _;
// Тут не возникнет конфликта имен:
pub trait Read {}
Подробности смотрите в примечаниях к выпуску.
Стабилизация стандартной библиотеки
Вот список всего, что стало константным:
- Методы overflowing_{add, sub, mul, shl, shr} всех численных типов теперь константны.
- Методы rotate_left, rotate_right, и wrapping_{add, sub, mul, shl, shr} всех численных типов теперь константны.
- Методы is_positive и is_negative всех знаковых численных типов теперь константны.
- Метод get всех NonZero типов теперь константен.
- Методы count_ones, count_zeros, leading_zeros, trailing_zeros, swap_bytes, from_be, from_le, to_be, to_le всех числовых типов теперь константны.
- Метод Ipv4Addr::new теперь константен.
Кроме того, стабилизированы следующие API:
- unix::FileExt::read_exact_at и unix::FileExt::write_all_at
- Option::transpose и Result::transpose
- convert::identity
- Вышеупомянутые pin::Pin и marker::Unpin
- marker::PhantomPinned
- Vec::resize_with и VecDeque::resize_with
- Duration::as_millis, Duration::as_micros и Duration::as_nanos
Подробности смотрите в примечаниях к выпуску.
Улучшения в Cargo
Подробности смотрите в примечаниях к выпуску.
Crates.io
Как было объявлено ранее, начиная с этого выпуска crates.io будет требовать подтверждения почтового адреса для публикации крейтов. Начиная с 2019-03-01 00:00 UTC выполнение cargo publish
будет завершаться с ошибкой для учетных записей без подтвержденной почты.
Это необходимо для соответствия требованиям DMCA. Если вы не заметили предупреждений об этом, которые cargo писал в последних выпусках, зайдите в crates.io/me для указания и подтверждения вашей почты. Данный почтовый адрес никогда не будет опубликован и будет использован исключительно для непосредственного функционала crates.io.
Разработчики 1.33.0
Множество людей совместно создавало Rust 1.33. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!
Автор: ozkriff