Команда Rust рада анонсировать новую версию Rust, 1.68.0. Rust - это язык программирования, который позволяет всем создавать надежное и эффективное программное обеспечение.
Если у вас установлена предыдущая версия Rust через rustup, вы можете получить 1.68.0:
rustup update stable
Если у вас его еще нет, вы можете получить rustup с соответствующей страницы на нашем веб-сайте и ознакомиться с подробными примечаниями к выпуску 1.68.0 на GitHub.
Если вы хотите помочь нам, протестировав будущие версии, вы можете рассмотреть возможность локального обновления, чтобы использовать бета-канал (rustup default beta) или ночной канал (rustup default nightly). Пожалуйста, сообщайте о любых ошибках, с которыми вы можете столкнуться!
Что находится в стабильной версии 1.68.0
В cargo протокол sparse
«sparse» протокол регистрации пакетов был стабилизирован для считывания индекса пакетов, а также инфраструктуры на 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 через несколько месяцев. Для получения дополнительной информации см. предварительное объявление в блоге Inside Rust, а также RFC 2789 и текущую документацию в Cargo Book.
Локальная Pin конструкция
Новый pin!
макрос создает Pin<&mut T>
из выражения T
, анонимно захваченного в локальном состоянии. Это часто называют закреплением стека, но этот «стек» также может быть захваченным состоянием асинхронной функции или блока. Этот макрос похож на некоторые пакеты, такие как tokio::pin!
, но стандартная библиотека может использовать преимущества внутренних компонентов Pin
и временного продления времени жизни для более выразительного макроса.
/// Запускает future до конца.
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);
// Закрепите future, чтобы его можно было опросить.
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 по умолчанию
При сбое выделения в Rust API, такие как Box::new
и Vec::push
, не могут указывать на этот сбой, поэтому необходимо использовать некоторый дивергентный путь выполнения. При использовании std, программа будет печатать на stderr и прекращать работу. Начиная с версии Rust 1.68.0, двоичные файлы, которые включают std, будут продолжать иметь такое поведение. Двоичные файлы, которые не включают std, только включают alloc, теперь будут паниковать при сбое распределения, который при необходимости может быть дополнительно скорректирован с помощью #[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 в Rust теперь ориентирована на NDK r25, что соответствует минимальному поддерживаемому уровню API 19 (KitKat).
Проверьте все, что изменилось в Rust, Cargo и Clippy.
Участники 1.68.0
Многие люди объединились, чтобы создать Rust 1.68.0. Мы не смогли бы сделать это без всех вас. Спасибо!