- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада объявить о новой версии Rust 1.46.0. Rust — это язык программирования, который позволяет каждому создавать надёжное и эффективное программное обеспечение.
Если у вас установлена предыдущая версия Rust через rustup, получить Rust 1.46.0 так же просто, как:
rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его [1] с соответствующей страницы нашего веб-сайта и ознакомиться с подробными примечаниями к выпуску 1.46.0 [2] на GitHub.
Этот выпуск достаточно небольшой, с улучшениями в const fn, стабилизацией двух новых API в стандартной библиотеке и одной опции, удобной для авторов библиотек. Смотрите подробные примечания к выпуску [2] чтобы узнать о других изменениях, не представленных в данном анонсе.
#[track_caller]Вернёмся в март, когда был выпущен Rust 1.42, в котором улучшились сообщения об ошибках, когда unwrap и подобные функции приводили к панике [3]. Тогда мы упоминали, что реализация ещё не стабильна. В Rust 1.46 мы её стабилизировали.
Этот атрибут зовётся #[track_caller] и был предложен в RFC 2091 [4] аж в июле 2017! Если вы пишете функцию, подобную unwrap, которая может приводить к панике, вы можете добавить эту аннотацию к вашей функции, и модуль форматирования паники по умолчанию будет использовать её для отображения сообщения об ошибке. Например, unwrap:
pub fn unwrap(self) -> T {
match self {
Some(val) => val,
None => panic!("вызван `Option::unwrap()` на значении `None`"),
}
}
Теперь будет выглядеть так:
#[track_caller]
pub fn unwrap(self) -> T {
match self {
Some(val) => val,
None => panic!("вызван `Option::unwrap()` на значении `None`"),
}
}
Вот и всё!
Если вы сами реализуете ловушку паники, вы можете использовать метод вызывающей стороны [5] в std::panic::Location, чтобы получить доступ к этой информации.
const fnТеперь вы также можете использовать в const fn некоторые базовые языковые вещи [6], такие как:
if, if let и matchwhile, while let и loop&& и ||А также преобразование в срез [7]:
const fn foo() {
let x = [1, 2, 3, 4, 5];
// преобразовываем массив в срез
let y: &[_] = &x;
}
Хотя эти функции могут не казаться вам новыми, учитывая, что вы можете использовать их все помимо const fn, они добавляют много вычислительной мощности во время компиляции! Как, например, библиотека const-sha1 [8] может позволить вам вычислить хэши SHA1 во время компиляции. Это привело к 40-кратному повышению производительности [9] в Microsoft WinRT для Rust.
На волне улучшений в const fn, std::mem::forget теперь тоже const fn [10]. Дополнительно в этом выпуске были стабилизированы два новых API:
Option::zip [11]vec::Drain::as_slice [12]Для получения более детальной информации, смотрите подробные примечания к выпуску [2].
Синтаксис [2], пакетный менеджер Cargo [13] и анализатор Clippy [14] также претерпели некоторые изменения.
Множество людей собрались вместе, чтобы создать Rust 1.46.0. Мы не смогли бы сделать это без всех вас. Спасибо [15]!
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате [16] или же в аналогичном чате для новичковых вопросов [17]. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков [18].
Так же можете поддержать нас на opencollective: https://opencollective.com/rust-lang-ru [19].
Данную статью совместными усилиями перевели funkill [20], Hirrolot [21] и andreevlex [22].
Автор: RustLangRu
Источник [23]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/356453
Ссылки в тексте:
[1] установить его: https://www.rust-lang.org/install.html
[2] подробными примечаниями к выпуску 1.46.0: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1460-2020-08-27
[3] улучшились сообщения об ошибках, когда unwrap и подобные функции приводили к панике: https://blog.rust-lang.org/2020/03/12/Rust-1.42.html#useful-line-numbers-in-option-and-result-panic-messages
[4] RFC 2091: https://github.com/rust-lang/rfcs/pull/2091
[5] вызывающей стороны: https://doc.rust-lang.org/stable/std/panic/struct.Location.html#method.caller
[6] некоторые базовые языковые вещи: https://github.com/rust-lang/rust/pull/72437/
[7] преобразование в срез: https://github.com/rust-lang/rust/pull/73862/
[8] const-sha1: https://github.com/rylev/const-sha1
[9] 40-кратному повышению производительности: https://github.com/microsoft/winrt-rs/pull/279#issuecomment-668436700
[10] std::mem::forget теперь тоже const fn: https://github.com/rust-lang/rust/pull/73887/
[11] Option::zip: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.zip
[12] vec::Drain::as_slice: https://doc.rust-lang.org/stable/std/vec/struct.Drain.html#method.as_slice
[13] пакетный менеджер Cargo: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-146-2020-08-27
[14] анализатор Clippy: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-146
[15] Спасибо: https://thanks.rust-lang.org/rust/1.46.0/
[16] русскоязычном Телеграм-чате: https://t.me/rustlang_ru
[17] чате для новичковых вопросов: https://t.me/rust_beginners_ru
[18] чат переводчиков: https://t.me/rustlang_ru_translations
[19] https://opencollective.com/rust-lang-ru: https://opencollective.com/rust-lang-ru
[20] funkill: https://habr.com/ru/users/funkill/
[21] Hirrolot: https://habr.com/ru/users/hirrolot/
[22] andreevlex: https://habr.com/ru/users/andreevlex/
[23] Источник: https://habr.com/ru/post/517018/?utm_source=habrahabr&utm_medium=rss&utm_campaign=517018
Нажмите здесь для печати.