[Перевод] Rust 1.68.0: разреженный протокол cargo, локальный pin, обработчик ошибок аллокации

caa34d51069212ec4f48c7bcdb3339ff

Команда 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(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

Следующие API теперь возможно использовать в контексте const:


Прочие изменения


  • Как ранее сообщалось, целевой платформой для Android теперь является NDK r25, которая соответствует минимально поддерживаемому уровню API 19 (KitKat).

Проверьте всё, что изменилось в Rust, Cargo и Clippy.


Участники 1.68.0

Многие люди собрались вместе, чтобы создать Rust 1.68.0. Без вас мы бы не справились. Спасибо!


От переводчиков

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

Данную статью совместными усилиями перевели andreevlex, TelegaOvoshey и funkill.

© Habrahabr.ru