Rust 1.55: обновление `std::io::ErrorKind`, изменение алгоритма разбора чисел с плавающей точкой

в 14:52, , рубрики: cargo, clippy, open source, release, Rust, rustc, rustdoc, rustfix, rustfmt, stable, выпуск версий, Компиляторы, новости технологий, перевод, Программирование, системное программирование, стабильная версия, языки программирования

Команда Rust рада сообщить о выпуске новой версии — 1.55.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.55.0 вам достаточно выполнить следующую команду:

rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.

Что стабилизировано в 1.55.0

Удалено отображение дубликатов ошибок компилятора в Cargo

В прошлых выпусках при использовании cargo test, cargo check --all-targets или аналогичных команд, которые собирают один и тот же Rust-крейт для нескольких конфигураций, ошибки и предупреждения могли отображаться дублированными, поскольку rustc запускались параллельно и показывали одно и то же предупреждение.

Например, в 1.54.0 часто можно было встретить следующий вывод:

$ cargo +1.54.0 check --all-targets
    Checking foo v0.1.0
warning: function is never used: `foo`
 --> src/lib.rs:9:4
  |
9 | fn foo() {}
  |    ^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: 1 warning emitted

warning: function is never used: `foo`
 --> src/lib.rs:9:4
  |
9 | fn foo() {}
  |    ^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: 1 warning emitted

    Finished dev [unoptimized + debuginfo] target(s) in 0.10s

В версии 1.55 это поведение было скорректировано — теперь информация о дубликатах отображается в итоговом отчёте по завершении компиляции:

$ cargo +1.55.0 check --all-targets
    Checking foo v0.1.0
warning: function is never used: `foo`
 --> src/lib.rs:9:4
  |
9 | fn foo() {}
  |    ^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: `foo` (lib) generated 1 warning
warning: `foo` (lib test) generated 1 warning (1 duplicate)
    Finished dev [unoptimized + debuginfo] target(s) in 0.84s

Более быстрый, более корректный разбор чисел с плавающей точкой

Реализация разбора чисел с плавающей точкой в стандартной библиотеке была обновлена с использованием алгоритма Эйзеля-Лемира (Eisel-Lemire), который обеспечивает как более высокую скорость, так и лучшую корректность. Раньше некоторые граничные случаи разобрать было нельзя, теперь это исправлено.

Более подробную информацию о новой реализации можно прочитать в описании пул-запроса.

Обновлены варианты std::io::ErrorKind

std::io::ErrorKind — это #[non_exhaustive] перечисление, которое классифицирует ошибки по переносимым категориям, таким как NotFound или WouldBlock. Код Rust, содержащий std::io::Error, может вызвать метод kind для получения std::io::ErrorKind и сопоставлять его для обработки конкретной ошибки.

Не все ошибки классифицируются по значениям ErrorKind — некоторые оставлены без категорий и помещены в универсальный вариант. В предыдущих версиях Rust для ошибок без категорий использовали ErrorKind::Other. Тем не менее, std::io::Error, созданные пользователями, также часто используют ErrorKind::Other. В 1.55 неклассифицированные ошибки теперь используют внутренний вариант ErrorKind::Uncategorized, который мы намерены оставить скрытым и никогда не доступным, чтобы стабильный код Rust имел явное имя. Это резервирует ErrorKind::Other исключительно для создания std::io::Error, которые не поступают из стандартной библиотеки. Это подтверждает #[non_exhaustive]-характер для ErrorKind.

Код Rust никогда не должен сопоставлять вариант ErrorKind::Other и ожидать какого-либо конкретного базового кода ошибки — только ErrorKind::Other, если вы обнаружили сконструированный std::io::Error, который использует этот тип. Сопоставление кода Rust на std::io::Error должно всегда использовать _ для любых неизвестных типов ошибок. В этом случае оно может соответствовать базовому коду ошибки — или сообщать об ошибке, или передавать её вызывающему коду.

Мы вносим это изменение, чтобы облегчить внедрение новых вариантов ErrorKind в будущем; эти новые варианты будут появляться только в nightly-сборках — они станут стабильными позже. Оно гарантирует, что неизвестные варианты сопоставления кода должны использовать шаблон _, который будет работать как с ErrorKind::Uncategorized, так и с будущими нестабилизированными вариантами.

Добавлены открытые диапазоны в шаблонах

В Rust 1.55 стабилизировано использование открытых диапазонов в шаблонах:

match x as u32 {
      0 => println!("zero!"),
      1.. => println!("positive number!"),
}

Подробнее можно узнать здесь.

Стабилизированные API

Стабилизированы следующие методы и реализации трейтов:

Следующие ранее стабилизированные API стали const:

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

Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.

Участники 1.55.0

Множество людей собрались вместе, чтобы создать Rust 1.55.0. Мы не смогли бы сделать это без всех вас. Спасибо!

Посвящение

Эта версия посвящена памяти Анны Хэрен — она была участницей сообщества Rust и помогала его развитию. Именно она ввела термин "Turbofish" и описала синтаксис ::<>. Недавно она скончалась от рака. Её вклад навсегда запомнится и будет частью языка.

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

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

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

Автор:
RustLangRu

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js