Упрощённый протокол проверки крейтов

(Cargo's sparse protocol)

Протокол "sparse" реестра Cargo был стабилизирован для чтения индекса крейтов, а также была создана база данных на https://index.crates.io/ для тех крейтов, которые опубликованы в основном хранилище crates.io. Прежний протокол git (который по-прежнему является стандартным) клонирует репозиторий, который индексирует все крейты, доступные в реестре, но он начал сталкиваться с проблемами масштабирования, вызывая заметные задержки при обновлении этого репозитория. Новый протокол должен значительно повысить производительность при доступе к crates.io, так как он будет загружать только информацию о том подмножестве крейтов, которое вы действительно используете.

Для использования "sparse" протокола с crates.io, установите переменную окружения
CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
или отредактируйте свой файл .cargo/config.toml, чтобы добавить:

[registries.crates-io]
protocol = "sparse"

Протокол sparse скоро станет стандартом для пакетного менеджера crates.io в релизе 1.70.0. Он позволяет экономить место на диске, уменьшая размер индекса пакетов. Вы можете узнать больше информации о нем в блоге Rust, а также в документации Cargo Book.

Локальное выражение Pin

(Local Pin construction)

Новый макрос pin! позволяет создавать Pin<&mut T> из выражения T, захваченного в локальном состоянии. Это называется "закрепление на стеке", но этот "стек" может быть также захвачен состоянием в async fn или блоке. Этот макрос похож на некоторые крейты, такие как tokio::pin!, но стандартная библиотека может использовать элементы Pin и временное продление жизненного цикла (temporary lifetime extension) для более выразительного кода макроса.

/// Runs a future to completion.
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);
    // Pin the future so it can be polled.
    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>, и уже эта временная локальная переменная с pin будет проверена на заимствование, чтобы убедиться, что она не может просуществовать дольше локальной переменной.

Обработчик ошибок alloc

(Default alloc error handler)

Когда возникает ошибка выделения памяти в Rust, API таких как Box::new и Vec::push, не имеют способа сигнализировать об этой ошибке, поэтому необходимо принять какой-то другой путь выполнения. При использовании крейта std, программа будет выводить сообщение в stderr и завершаться. Начиная с Rust 1.68.0, для бинарных файлов, включающих std, это поведение сохранится. Для бинарных файлов, включающих только alloc, будут вызываться ошибки panic! при сбое выделения памяти, что может быть дополнительно настроено с помощью #[panic_handler], если это требуется.

В будущем вероятно, что поведение для пакета std также изменится, соответствуя поведению при использовании только пакета alloc.

Всё это и больше найдёшь на официальном блоге blog.rust-lang.org

Благодарю за прочтение ????????

Комментарии (1)