Команда Rust рада сообщить о новой версии языка — 1.68.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.68.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta
) или nightly (rustup default nightly
) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Что стабилизировано в 1.68.0
Разреженный протокол cargo
Разреженный протокол cargo для registry был стабилизирован для чтения индекса пакетов вместе с инфраструктурой https://index.crates.io/
, которая становится главным реестром crates.io. Предыдущий протокол git (он всё ещё является стандартным) клонирует репозиторий, который содержит все доступные в реестре пакеты, но из-за достижения лимитов масштабирования это стало вызывать ощутимые задержки при обновлении репозитория. Новый протокол должен предоставить значительные улучшения в производительности при доступе к crates.io, так как он скачивает информацию только о тех пакетах, которые вы действительно используете.
Для использования разреженного протокола crates.io установите переменную окружения CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
или добавьте в .cargo/config.toml
:
[registries.crates-io]
protocol = "sparse"
Планируется, что разреженный протокол в ближайшие месяцы станет основным для crates.io в версии 1.70.0. Для большей информации, пожалуйста, посмотрите анонс в блоге Inside Rust, а также RFC 2789 и текущую документацию в Cargo Book.
Локальное создание Pin
Новый макрос pin!
создаёт Pin<&mut T>
из T
, анонимно захватывая его локальное состояние. Такое иногда называют блокировкой стека (stack pinning), но этот "стек" может захватывать состояние блока или async fn
. Этот макрос подобен макросу из таких пакетов, как tokio::pin!
, но, содержась в стандартной библиотеки, он получает преимущества внутренней реализации Pin и временно продлевает время жизни для макросов, подобных выражениям.
/// Полностью выполняет футуру.
fn block_on<F: Future>(future: F) -> F::Output {
let waker_that_unparks_thread = todo!();
let mut cx = Context::from_waker(&waker_that_unparks_thread);
// Футура запинена, так что она может быть опрошена.
let mut pinned_future = pin!(future);
loop {
match pinned_future.as_mut().poll(&mut cx) {
Poll::Pending => thread::park(),
Poll::Ready(result) => return result,
}
}
}
В этом примере исходная future
перемещена во временную локальную переменную, ссылающуюся на новую переменную pinned_future
с типом Pin<&mut F>
. Таким образом pinned_future
будет закреплена для наблюдения анализатором заимствований, а мы будем уверены, что её время жизни не превысит время жизни локальной переменной.
Обработчик ошибок alloc
по умолчанию
Когда Rust не может выделить память, API, подобные Box::new и Vec::push, не имеют возможности сообщить об этой ошибке, из-за чего нужно выбрать какой-то путь выполнения. При использовании пакета std программа выведет информацию об этом в stderr и завершится. В Rust 1.68.0 программы, использующие std, по-прежнему будут обладать таким поведением. Программы, не включающие std, а только alloc, теперь будут вызывать panic! при ошибке аллокации, который далее при необходимости может быть обработан с помощью #[panic_handler].
В будущем такое поведение, вероятно, будет применено и к std
, чтобы соответствовать поведению alloc
.
Стабилизированные API
{core,std}::pin::pin!
impl From<bool> for {f32,f64}
std::path::MAIN_SEPARATOR_STR
impl DerefMut for PathBuf
Следующие API теперь возможно использовать в контексте const
:
Прочие изменения
- Как ранее сообщалось, целевой платформой для Android теперь является NDK r25, которая соответствует минимально поддерживаемому уровню API 19 (KitKat).
Проверьте всё, что изменилось в Rust, Cargo и Clippy.
Участники 1.68.0
Многие люди собрались вместе, чтобы создать Rust 1.68.0. Без вас мы бы не справились. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Данную статью совместными усилиями перевели andreevlex, TelegaOvoshey и funkill.