Команда разработчиков 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. Мы не смогли бы завершить работу без участия каждого из вас. Спасибо!
Комментарии (18)
Cheater
01.03.2019 14:42rustup update stable
Кто-нибудь может плз объяснить, почему бы этим не заниматься пакетному менеджеру дистрибутива?Cerberuser
01.03.2019 14:52+1Во-первых, кто будет каждые шесть недель оперативно выкатывать обновления во все репозитории? Во-вторых, rustup всё равно не лишний, хотя бы как и менеджер версий (не так и мало тех, кому нужны одновременно установленные stable и nightly или, скажем, x86_64 и wasm).
Cheater
01.03.2019 15:01Во-первых, кто будет каждые шесть недель оперативно выкатывать обновления во все репозитории?
Эмм, участник команды разработчиков rust, отвечающий за поддержку в популярных дистрибутивах?
не так и мало тех, кому нужны одновременно установленные stable и nightly или, скажем, x86_64 и wasm
Известные мне менеджеры пакетов поддерживают одновременно наличие различных версий пакета в системе. У меня прямо сейчас стоят gcc7 и 8 под x86-64 и gcc под arm.
Gorthauer87
02.03.2019 11:35По мне так проще иметь на всех системах одинаковую инфраструктуру. Тем более пакеты я не создаю в процессе разработки
Draugdor
01.03.2019 14:55У меня Windows тут всё ясно, Gentoo nightly релизы пересобирать придется из исходников постоянно, это тяжеловато, Freebsd задержка в релизе заметная.
humbug
01.03.2019 14:56+1Потому что rustup умеет больше, нежели пакетный менеджер. Во-первых, скорость доставки выше, пока там еще соберут rustc из исходников. Во-вторых, rustup умеет ставить не только nightly/beta/stable, но и переключаться между версиями, устанавливать тулчейны для кросскомпиляции в другие архитектуры, устанавливать компоненты вроде clippy, fmt… и т.д.
Cheater
01.03.2019 15:08умеет больше, нежели пакетный менеджер
это в любом случае недостаточная причина для обхода пакетного менеджера. вы представляете, что будет, если каждый пакет в вашем дистрибутиве будет считать, что он лучше системного менеджера пакетов знает, как обновляться?
rustup умеет ставить не только nightly/beta/stable, но и переключаться между версиями
apt тоже (+ update-alternatives)
устанавливать тулчейны для кросскомпиляции в другие архитектуры
apt тоже
устанавливать компоненты вроде clippy, fmt
почему не сделать их пакетами дистрибутива, зависящими от rust?Alexey2005
01.03.2019 16:57+2вы представляете, что будет, если каждый пакет в вашем дистрибутиве будет считать, что он лучше системного менеджера пакетов знает, как обновляться?
А в сфере разработки давно уже так и есть. Всё, что связано с npm, например TypeScript, обновляется не через системный менеджер. WebStorm тоже не из репа, а самостоятельно обновы качает. Всё, что в Python-инфраструктуре, обновляется через pip.
STM32CubeMX и прочее для разработки под stm32 обновы само качает. Android Studio само качает. Google Cloud SDK сам качает, MS Azure то же самое.
Ну и так далее.
ozkriff Автор
01.03.2019 15:15Хм, а почему не про Cargo вопрос? Системные пакетные менеджеры библиотеки ставить умеют же.
Cheater
01.03.2019 15:24Сrates гораздо ближе к пользовательским данным, чем к системным компонентам (т.е. я не вижу проблем чтобы иметь общесистемные crates и crates в .cargo одновременно. В perl я точно так же имею общесистемные плагины в /usr/share/perl5 и плагины, установленные в /home через metacpan — последнее ест-но на свой страх и риск). А вот компилятор Rust точно системный компонент.
ozkriff Автор
01.03.2019 15:20А работы по проталкиванию раста в пакетные менеджеры популярных осей вполне себе ведутся (под федору с дебианом, как минимум), но возня с заморочками и политиками каждого пакетного менеджера и его экосистемы это на порядок более сложный и долгий процесс, чем сделать самим хорошее частное решение для конкретных проблем.
technic93
02.03.2019 13:09Большая фрагментация Линукс. Нужно оперативно доставлять все апдейты, в том числе и nightly. Во многих дистрах есть раст в пакетном менеджере, но не самой свежей версии.
AngReload
01.03.2019 20:23Черт. До этого поста даже не подозревал что const fn могут работать не только с костантантными параметрами во время компиляции, но и как обычные функции.
whitemonkey
02.03.2019 17:18А почему в любом посте про Rust, слово Rust повторяется с неимоверной частотой?
ozkriff Автор
03.03.2019 00:41В принципе, парочку повторений в русском варианте можно бы и убрать без потери смысла, но на весь текст новости "Rust" всего восемь раз используется, я бы не сказал что это как-то очень много.
snuk182
Как совсем недавно уточнялось в гиттере, смысл
Pin
не просто в сохранении адреса объекта в памяти, но и сохранения там самого объекта, то есть невозможность его перезаписи другим объектом такого же типа по данному неизменному адресу.