Упрощённый протокол проверки крейтов
(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
Благодарю за прочтение ????????
andreymal
https://habr.com/post/722152/