- PVSM.RU - https://www.pvsm.ru -

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

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

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

rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску [1] на 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), который обеспечивает как более высокую скорость, так и лучшую корректность. Раньше некоторые граничные случаи разобрать было нельзя, теперь это исправлено.

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

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

std::io::ErrorKind [3] — это #[non_exhaustive] [4] перечисление, которое классифицирует ошибки по переносимым категориям, таким как NotFound или WouldBlock. Код Rust, содержащий std::io::Error [5], может вызвать метод kind [6] для получения 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!"),
}

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

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

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

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

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

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

Участники 1.55.0

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

Посвящение

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

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

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

Данную статью совместными усилиями перевели funkill [33], TelegaOvoshey [34], andreevlex [35], blandger [36], belanchuk [37] и SomeAkk.

Автор:
RustLangRu

Источник [38]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/367755

Ссылки в тексте:

[1] подробные примечания к выпуску: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-55-2021-09-09

[2] в описании пул-запроса: https://github.com/rust-lang/rust/pull/86761

[3] std::io::ErrorKind: https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html

[4] #[non_exhaustive]: https://doc.rust-lang.org/reference/attributes/type_system.html#the-non_exhaustive-attribute

[5] std::io::Error: https://doc.rust-lang.org/std/io/struct.Error.html

[6] метод kind: https://doc.rust-lang.org/std/io/struct.Error.html#method.kind

[7] здесь: https://github.com/rust-lang/rust/pull/83918

[8] Bound::cloned: https://doc.rust-lang.org/stable/std/ops/enum.Bound.html#method.cloned

[9] Drain::as_str: https://doc.rust-lang.org/stable/std/string/struct.Drain.html#method.as_str

[10] IntoInnerError::into_error: https://doc.rust-lang.org/stable/std/io/struct.IntoInnerError.html#method.into_error

[11] IntoInnerError::into_parts: https://doc.rust-lang.org/stable/std/io/struct.IntoInnerError.html#method.into_parts

[12] MaybeUninit::assume_init_mut: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_mut

[13] MaybeUninit::assume_init_ref: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_ref

[14] MaybeUninit::write: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write

[15] array::map: https://doc.rust-lang.org/stable/std/primitive.array.html#method.map

[16] ops::ControlFlow: https://doc.rust-lang.org/stable/std/ops/enum.ControlFlow.html

[17] x86::_bittest: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittest.html

[18] x86::_bittestandcomplement: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandcomplement.html

[19] x86::_bittestandreset: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandreset.html

[20] x86::_bittestandset: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandset.html

[21] x86_64::_bittest64: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittest64.html

[22] x86_64::_bittestandcomplement64: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandcomplement64.html

[23] x86_64::_bittestandreset64: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandreset64.html

[24] x86_64::_bittestandset64: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandset64.html

[25] str::from_utf8_unchecked: https://doc.rust-lang.org/stable/std/str/fn.from_utf8_unchecked.html

[26] пакетный менеджер Cargo: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-155-2021-09-09

[27] анализатор Clippy: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-155

[28] Спасибо!: https://thanks.rust-lang.org/rust/1.55.0/

[29] русскоязычном Телеграм-чате: https://t.me/rustlang_ru

[30] чате для новичковых вопросов: https://t.me/rust_beginners_ru

[31] чат переводчиков: https://t.me/rustlang_ru_translations

[32] OpenCollective: https://opencollective.com/rust-lang-ru

[33] funkill: https://habr.com/ru/users/funkill/

[34] TelegaOvoshey: https://habr.com/ru/users/telegaovoshey/

[35] andreevlex: https://habr.com/ru/users/andreevlex/

[36] blandger: https://habr.com/ru/users/blandger/

[37] belanchuk: https://habr.com/ru/users/belanchuk/

[38] Источник: https://habr.com/ru/post/577336/?utm_source=habrahabr&utm_medium=rss&utm_campaign=577336