- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада сообщить о выпуске новой версии — 1.55.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.55.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску [1] на GitHub.
В прошлых выпусках при использовании 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::ErrorKindstd::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].
Стабилизированы следующие методы и реализации трейтов:
Bound::cloned [8]Drain::as_str [9]IntoInnerError::into_error [10]IntoInnerError::into_parts [11]MaybeUninit::assume_init_mut [12]MaybeUninit::assume_init_ref [13]MaybeUninit::write [14]array::map [15]ops::ControlFlow [16]x86::_bittest [17]x86::_bittestandcomplement [18]x86::_bittestandreset [19]x86::_bittestandset [20]x86_64::_bittest64 [21]x86_64::_bittestandcomplement64 [22]x86_64::_bittestandreset64 [23]x86_64::_bittestandset64 [24]Следующие ранее стабилизированные API стали const:
Синтаксис [1], пакетный менеджер Cargo [26] и анализатор Clippy [27] также претерпели некоторые изменения.
Множество людей собрались вместе, чтобы создать 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
Нажмите здесь для печати.