- PVSM.RU - https://www.pvsm.ru -
Команда Rust рада представить новую версию языка — 1.58.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.58.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё нет rustup
, то можете установить его со страницы [1] на нашем веб-сайте, а также ознакомиться с подробным описанием выпуска 1.58.0 [2] на GitHub.
В Rust 1.58 появились захваченные идентификаторы в форматируемых строках, изменился путь поиска в Windows для Command
, в стандартной библиотеке стало больше аннотаций #[must_use]
, а также были стабилизированы некоторые функции.
Форматируемые строки теперь могут захватывать аргументы, если вы просто напишете {ident}
в строке. Форматируемые строки уже давно принимают позиционные аргументы (возможно, по индексу) и именованные аргументы. Например:
println!("Hello, {}!", get_person()); // implicit position
println!("Hello, {0}!", get_person()); // explicit index
println!("Hello, {person}!", person = get_person()); // named
Сейчас именованные аргументы также могут быть захвачены из окружения, например:
let person = get_person();
// ...
println!("Hello, {person}!"); // captures the local `person`
Это также может использоваться в параметрах форматирования:
let (width, precision) = get_format();
for (name, score) in get_scores() {
println!("{name}: {score:width$.precision$}");
}
Форматируемые строки могут захватывать только простые идентификаторы, но не произвольные пути или выражения. Для более сложных аргументов либо сначала присвойте им локальное имя, либо используйте старый стиль форматирования аргументов name = expression
.
Эта функция работает во всех макросах, принимающих форматируемые строки. Тем не менее, существует один крайний случай — работа макроса panic!
в выпусках 2015 и 2018, где panic!("{ident}")
по-прежнему обрабатывается как обычная строка. Компилятор предупредит об этом, но ожидаемого эффекта не произойдёт. Благодаря обновлению макроса паники в выпуске 2021 года для улучшения согласованности [3] в panic!
это будет работать ровно так, как и ожидалось.
Command
на WindowsНа Windows std::process::Command
больше не ищет исполняемые файлы в текущей директории. Этот эффект был связан с поведением win32 API CreateProcess
[4], из-за чего поиск осуществлялся в следующем порядке:
PATH
дочернего процесса, если эта переменная явно изменялась родительским процессом.PATH
Однако использование текущего каталога может привести к неожиданным результатам или даже опасному поведению при работе с ненадёжными директориями. Например, ripgrep
опубликовали CVE-2021-3013 [5] когда узнали, что их дочерние процессы могут быть перехвачены таким образом. Даже собственные документы [6] PowerShell Microsoft не используют текущую директорию ради безопасности.
Теперь Rust осуществляет свой поиск без учёта текущей директории и старой 16-битной директории, так как нет API, чтобы найти её расположение. Так что новый порядок поиска для Command
на Windows таков:
PATH
PATH
Не ориентированные на Windows приложения продолжат использовать прежнее специфическое для платформы поведение, чаще всего учитывая только дочернюю или родительскую переменную окружения PATH
.
#[must_use]
в стандартной библиотекеАтрибут #[must_use]
применяется к типам и функциям, у которых отсутствие явной обработки или результата считается ошибкой. Это давно используется в стандартной библиотеке для типов, подобных Result
, которые должны быть проверены на наличие ошибок. Атрибут также помогает отловить ошибки ожидания изменения функцией передаваемого значения, в то время как она возвращает новое значение.
Библиотечное предложение №35 [7] было одобрено для проверки в октябре 2021 года и расширяет применение #[must_use]
в стандартной библиотеке. Оно покрывает больше функций, основной эффект которых — возвращение значения. Похоже на идею чистоты функций, но более слабо, чем настоящая языковая черта. Часть функций была представлена в 1.57.0 — теперь же добавлена оставшаяся часть.
Стабилизированы следующие методы и реализации трейтов:
Metadata::is_symlink
[8]Path::is_symlink
[9]{integer}::saturating_div
[10]Option::unwrap_unchecked
[11]Result::unwrap_unchecked
[12]Result::unwrap_err_unchecked
[13]File::options
[14]Следующие ранее стабилизированные API стали const
:
Duration::new
[15]Duration::checked_add
[16]Duration::saturating_add
[17]Duration::checked_sub
[18]Duration::saturating_sub
[19]Duration::checked_mul
[20]Duration::saturating_mul
[21]Duration::checked_div
[22]В синтаксис [2], пакетный менеджер Cargo [23] и анализатор Clippy [24] также внесены некоторые изменения.
Множество людей объединились для создания Rust 1.58.0. Мы не смогли бы сделать это без всех вас. Спасибо! [25]
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате [26] или же в аналогичном чате для новичковых вопросов [27]. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков [28]. Также можете поддержать нас на OpenCollective [29].
Данную статью совместными усилиями перевели belanchuk [30], andreevlex [31], SomeAkk, TelegaOvoshey [32], torgeek [33], olafars [34] и funkill [35].
Автор:
RustLangRu
Источник [36]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/371293
Ссылки в тексте:
[1] страницы: https://www.rust-lang.org/install.html
[2] подробным описанием выпуска 1.58.0: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1580-2022-01-13
[3] улучшения согласованности: https://doc.rust-lang.org/stable/edition-guide/rust-2021/panic-macro-consistency.html
[4] CreateProcess
: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa
[5] CVE-2021-3013: https://www.cve.org/CVERecord?id=CVE-2021-3013
[6] документы: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_command_precedence?view=powershell-7.2
[7] предложение №35: https://github.com/rust-lang/libs-team/issues/35
[8] Metadata::is_symlink
: https://doc.rust-lang.org/stable/std/fs/struct.Metadata.html#method.is_symlink
[9] Path::is_symlink
: https://doc.rust-lang.org/stable/std/path/struct.Path.html#method.is_symlink
[10] {integer}::saturating_div
: https://doc.rust-lang.org/stable/std/primitive.i8.html#method.saturating_div
[11] Option::unwrap_unchecked
: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.unwrap_unchecked
[12] Result::unwrap_unchecked
: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_unchecked
[13] Result::unwrap_err_unchecked
: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_err_unchecked
[14] File::options
: https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.options
[15] Duration::new
: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.new
[16] Duration::checked_add
: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_add
[17] Duration::saturating_add
: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_add
[18] Duration::checked_sub
: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_sub
[19] Duration::saturating_sub
: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_sub
[20] Duration::checked_mul
: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_mul
[21] Duration::saturating_mul
: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_mul
[22] Duration::checked_div
: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_div
[23] пакетный менеджер Cargo: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-158-2022-01-13
[24] анализатор Clippy: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-158
[25] Спасибо!: https://thanks.rust-lang.org/rust/1.58.0/
[26] русскоязычном Телеграм-чате: https://t.me/rustlang_ru
[27] чате для новичковых вопросов: https://t.me/rust_beginners_ru
[28] чат переводчиков: https://t.me/rustlang_ru_translations
[29] OpenCollective: https://opencollective.com/rust-lang-ru
[30] belanchuk: https://habr.com/ru/users/belanchuk/
[31] andreevlex: https://habr.com/ru/users/andreevlex/
[32] TelegaOvoshey: https://habr.com/ru/users/telegaovoshey/
[33] torgeek: https://habr.com/ru/users/torgeek/
[34] olafars: https://habr.com/ru/users/olafars/
[35] funkill: https://habr.com/ru/users/funkill/
[36] Источник: https://habr.com/ru/post/645697/?utm_source=habrahabr&utm_medium=rss&utm_campaign=645697
Нажмите здесь для печати.