Выпуск Rust 1.33.0
Команда разработчиков 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
теперь умеет гораздо больше,
а именно:
- неопровержимое (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», например:
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 {} |
Подробности смотрите в примечаниях к выпуску.
Стабилизация стандартной библиотеки
Вот список всего, что стало константным:
- Методы
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
будет требовать подтверждения почтового адреса для публикации крейтов.
Начиная с 01.03.2019 00:00 UTC выполнение cargo publish
будет завершаться
с ошибкой для учётных записей без подтверждённой почты.
Это необходимо для соответствия требованиям DMCA. Если вы не заметили предупреждений об этом, которые cargo писал в последних выпусках, зайдите в crates.io/me для указания и подтверждения вашей почты. Данный почтовый адрес никогда не будет опубликован и будет использован исключительно для непосредственного функционала crates.io.
Разработчики 1.33.0
Множество людей совместно создавало Rust 1.33. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!