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


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


rustup update stable

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


Сокращение пути поиска для Command на Windows


На Windows std::process::Command больше не ищет исполняемые файлы в текущей директории. Этот эффект был связан с поведением win32 API CreateProcess, из-за чего поиск осуществлялся в следующем порядке:


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

Однако использование текущего каталога может привести к неожиданным результатам или даже опасному поведению при работе с ненадёжными директориями. Например, ripgrep опубликовали CVE-2021-3013 ко��да узнали, что их дочерние процессы могут быть перехвачены таким образом. Даже собственные документы 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 было одобрено для проверки в октябре 2021 года и расширяет применение #[must_use] в стандартной библиотеке. Оно покрывает больше функций, основной эффект которых — возвращение значения. Похоже на идею чистоты функций, но более слабо, чем настоящая языковая черта. Часть функций была представлена в 1.57.0 — теперь же добавлена оставшаяся часть.


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


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



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



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


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


Участники 1.58.0


Множество людей объединились для создания Rust 1.58.0. Мы не смогли бы сделать это без всех вас. Спасибо!


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


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


Данную статью совместными усилиями перевели belanchuk, andreevlex, SomeAkk, TelegaOvoshey, torgeek, olafars и funkill.