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

Rust 1.58.0: захватываемые идентификаторы, пути поиска в Windows, больше #[must_use] в стандартной библиотеке

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

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

rustup update stable

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

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

В 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], из-за чего поиск осуществлялся в следующем порядке:

  1. (Специфично для Rust) Директории перечисленные в переменной окружения PATH дочернего процесса, если эта переменная явно изменялась родительским процессом.
  2. Директория, из которой было загружено приложение
  3. Текущая директория для родительского процесса
  4. Системная директория 32-битной Windows
  5. Системная директория 16-битной Windows
  6. Директория Windows
  7. Директории, указанные в переменной окружения PATH

Однако использование текущего каталога может привести к неожиданным результатам или даже опасному поведению при работе с ненадёжными директориями. Например, ripgrep опубликовали CVE-2021-3013 [5] когда узнали, что их дочерние процессы могут быть перехвачены таким образом. Даже собственные документы [6] PowerShell Microsoft не используют текущую директорию ради безопасности.

Теперь Rust осуществляет свой поиск без учёта текущей директории и старой 16-битной директории, так как нет API, чтобы найти её расположение. Так что новый порядок поиска для Command на Windows таков:

  1. Директории, указанные в дочерней переменной окружения PATH
  2. Директория, из которой было загружено приложение
  3. Системная директория 32-битной Windows
  4. Директория Windows
  5. Директории, указанные в переменной окружения PATH

Не ориентированные на Windows приложения продолжат использовать прежнее специфическое для платформы поведение, чаще всего учитывая только дочернюю или родительскую переменную окружения PATH.

Больше атрибутов #[must_use] в стандартной библиотеке

Атрибут #[must_use] применяется к типам и функциям, у которых отсутствие явной обработки или результата считается ошибкой. Это давно используется в стандартной библиотеке для типов, подобных Result, которые должны быть проверены на наличие ошибок. Атрибут также помогает отловить ошибки ожидания изменения функцией передаваемого значения, в то время как она возвращает новое значение.

Библиотечное предложение №35 [7] было одобрено для проверки в октябре 2021 года и расширяет применение #[must_use] в стандартной библиотеке. Оно покрывает больше функций, основной эффект которых — возвращение значения. Похоже на идею чистоты функций, но более слабо, чем настоящая языковая черта. Часть функций была представлена в 1.57.0 — теперь же добавлена оставшаяся часть.

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

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

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

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

В синтаксис [2], пакетный менеджер Cargo [23] и анализатор Clippy [24] также внесены некоторые изменения.

Участники 1.58.0

Множество людей объединились для создания 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